Ruby 使用查找哈希从多个哈希求和

Ruby sum from multiple hashes with a lookup hash

我在 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} 

有什么想法吗?

这里有两种方法。

#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} 

我在 northsouth 没有密钥 h[k] 的情况下附加了 to_i,如 nil.to_i #=> 0.

请注意,produce 的值必须是唯一的,才能获得您想要的结果。

这个怎么样:

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的key进行改造:

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}