如何将三个红宝石哈希合并为一个,添加常用键的值?

时间:2016-09-19 23:52:14

标签: ruby hash

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

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

我尝试了.merge,但似乎并没有添加公共密钥的值......至少我没有阻止这样做的方式。我也试过这个: this

所以,也许它可以用一个块???它是如何将三个哈希合并为一个,添加重叠的哈希,以这样的结尾:

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

2 个答案:

答案 0 :(得分:2)

您可以使用reduce + merge

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

答案 1 :(得分:1)

您可以使用默认值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