2016-09-19 27 views
0

如何获取三个哈希值并将它们合并为一个哈希值,以便在密钥是常见的情况下,它会添加值,并且在密钥是唯一的情况下,它只会将键/值对添加到最终加入的哈希?事情是这样的:如何将三个红宝石哈希合并为一个,添加常用密钥的值?

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?

所以,也许这是可能的一个块?它是如何巩固3个散列成一个,并称重叠的,像这样的东西结局:

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

请连同相关页面和[[mcve]]一起阅读“[问]”。我们希望看到您尝试解决这个问题,无论是通过搜索的页面,为什么他们没有帮助,还是一个演示为什么它不起作用的代码示例,以及最小的输入和输出以及码。没有这些,看起来你希望我们为你写出解决方案,这不是如何工作的。至少您可以搜索SO,其中有多个如何执行此操作的示例。 –

+0

我试过这个:[链接](http://stackoverflow.com/questions/33897616/ruby-combine-hashes) 和这个:[link](http://stackoverflow.com/questions/28946785/ruby-combining - 基于阵列的哈希值 - 散列值) 和这个:[link](http://stackoverflow.com/questions/8994297/ruby-combine-elements-in-hash) 和这个:[链接](http://stackoverflow.com/questions/29172821/complex-ruby-array-of-hashes-combine) 和其他......但他们都没有回答我无法解释的问题如何做自己。 截至目前,有两个答案完美地完成,并且不同于我在SO上发现的任何其他答案。 – Hoonta

+0

请编辑您的问题,并将“链接”移到问题的正文中,这样每个人都可以轻松阅读,而无需阅读每条评论。重要的是要明白,除了现在帮助你之外,你问的一个问题是在未来帮助其他人。这就是为什么我们对问题的内容太挑剔。 –

回答

2

你可以在使用reduce + merge

[r1, r2, r3].reduce({}){ |memo, obj| memo.merge(obj) { |key, old, new| old + new } } 
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 
+1

我认为这是要走的路,但是建议'[r1,r2,r3] .each_with_object(Hash.new(0))do | hash,r_total | ...',它返回所需的散列。如果你的代码被封装在一个方法中,你需要'r_total'作为最后一行。 –

相关问题