我在3个单独的哈希中有以下数据:
produce = {100=>"apples",200=>"oranges",300=>"pears"}
north = {100=>10,200=>7,300=>11}
south = {100=>5,200=>19,300=>0}
我需要为所有区域的所有产品项目清点计数:
{"apples"=>15,"oranges"=>26,"pears"=>11}
有什么想法吗?
答案 0 :(得分:1)
这有两种方法。
<强>#1 强>
produce.each_with_object({}) do |(k,v),h|
h[v] = north[k].to_i + south[k].to_i
end
#=> {"apples"=>15, "oranges"=>26, "pears"=>11}
<强>#2 强>
h = produce.invert
#=> {"apples"=>100, "oranges"=>200, "pears"=>300}
h.keys.each { |k| h[k] = north[h[k]].to_i + south[h[k]].to_i }
h
#=> {"apples"=>15, "oranges"=>26, "pears"=>11}
如果to_i
或north
没有密钥south
,我h[k]
附加了nil.to_i #=> 0
。
请注意,produce
的值必须是唯一的,才能获得所需的结果。
答案 1 :(得分:1)
这个怎么样:
Hash[north.merge(south){ |_, a, b| a + b}.map{ |k,v| [produce[k], v]}]
Hash#merge
合并了两个哈希值。
如果两个哈希具有相同的密钥并且我们传递一个块时发生冲突,则使用密钥,来自一个哈希的值,来自另一个哈希的值来调用该块,并将结果存储为值。因此
north.merge(south) {|_, a, b| a + b}
总结部分:
north.merge(south) {|_, a, b| a + b}
#=> {100=>15, 200=>26, 300=>11}
接下来,我们使用map
转换sum hash的键:
north.merge(south) {|_, a, b| a + b}.map{ |k,v| [produce[k], v]}
#=> [["apples", 15], ["oranges", 26], ["pears", 11]]
由于这会产生一个数组,我们使用Hash.[]
将其转换回哈希:
Hash[north.merge(south){ |_, a, b| a + b}.map{ |k,v| [produce[k], v]}]
=> {"apples"=>15, "oranges"=>26, "pears"=>11}