【问题标题】:How to consolidate three ruby hashes into one, adding the values for common keys?如何将三个 ruby​​ 哈希合并为一个,添加公共键的值?
【发布时间】:2016-09-19 23:52:13
【问题描述】:

如何获取三个散列并将它们连接到一个散列中,以便在键共同的情况下添加值,在键唯一的情况下,它只是将键/值对添加到最终加入哈希?像这样的:

r1 = { "Flour"  => 500, "Cheese"    => 1500, "Tomato Sauce" => 700 }
r2 = { "Bread"  => 300, "Cheese"    => 600,  "Butter"       => 450 }
r3 = { "Cheese" => 900, "Tortillas" => 250,  "Flour"        => 350 }

我试过.merge,但它似乎没有添加公共键的值……至少我这样做是没有障碍的。我也试过这个: Ruby combine hashes?

所以,也许有可能有一个块???这是如何将三个哈希合并为一个,添加重叠的哈希,以这样的方式结束:

r_total = { "Flour" => 850, "Cheese" => 3000, "Tomato Sauce" => 700, 
            "Bread" => 300, "Butter" => 450,  "Tortillas"    => 250 }

【问题讨论】:

  • 请阅读“How to Ask”以及链接页面和“minimal reproducible example”。我们希望看到您尝试解决此问题,无论是通过您搜索的页面以及它们没有帮助的原因,还是演示它为什么不起作用的代码示例,以及伴随的最小输入和输出代码。没有它,您似乎希望我们为您编写解决方案,这不是 SO 的工作方式。您至少可以搜索 SO,其中有多个示例说明如何执行此操作。
  • 我试过这个:link 和这个:link 和这个:link 和这个:link 和其他人......但他们都没有回答我无法回答的问题弄清楚如何做自己。到目前为止,有两个答案可以完美地做到这一点,并且与我在 SO 上找到的任何其他答案都不同。
  • 请编辑您的问题并将“链接”移动到问题的正文中,这样每个人都可以轻松阅读它们而无需阅读每条评论。重要的是要了解,您提出的问题除了现在帮助您之外,还可以帮助将来的其他人。这就是为什么我们对问题的内容如此挑剔。
  • 我理解希望问题和答案在未来对其他人有所帮助,所以我想我很困惑如何包含指向问题/答案的链接,这些问题/答案的作用与此问题的标题不同会做到这一点吗?标题非常具体,答案(到目前为止有两个)完美而简洁地回答了它。无论如何,作为该网站的新手,我会按照您的要求放入其中一个链接。

标签: ruby hash


【解决方案1】:

你可以使用reduce + merge:

   [r1, r2, r3].reduce({}){ |memo, obj| memo.merge(obj) { |key, old, new| old + new } }

【讨论】:

    【解决方案2】:

    您可以使用默认值 0 初始化哈希,然后遍历每个元素并将值相加。

    r_total = Hash.new(0)
    [r1, r2, r3].each do |hash|
        hash.each do |k, v|
            r_total[k] += v
        end
    end
    r_total
    

    【讨论】:

    • 我认为这是要走的路,但建议[r1, r2, r3].each_with_object(Hash.new(0)) do |hash, r_total|...,它返回所需的哈希值。如果你的代码被封装在一个方法中,你需要r_total作为最后一行。
    猜你喜欢
    • 2016-05-28
    • 2011-02-21
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 2019-05-31
    相关资源
    最近更新 更多