如何使用相同的键求和哈希数组中的值

时间:2019-02-27 13:04:56

标签: ruby hash

我想对相同键的值求和

arr = [{"69120090" => [1, 2, 3]}, {"69120090" => [4, 5, 6]}]

我需要得出:

result = [{"69120090" => [5, 7, 9]}]

2 个答案:

答案 0 :(得分:7)

Hash#merge!缩小:

arr = [{"69120090"=> [1, 2, 3] }, {"69120090"=> [4, 5, 6] }]
arr.each_with_object({}) do |h, acc|
  acc.merge!(h) { |_, v1, v2| v1.zip(v2).map(&:sum) }
end
#⇒ {"69120090"=>[5, 7, 9]}

以上内容接受任意数量的散列,每个散列均具有任意键。

答案 1 :(得分:0)

给定数组,只是有另一个选择:

arr = [{ a: [1, 2, 3], b:[8,9,0] }, { a: [4, 5, 6], c: [1,2,3] }, { b: [0,1,2], c: [1,2,3] } ]

您可以写:

tmp = Hash.new{ |k,v| k[v] = [] }
arr.each { |h| h.each { |k,v| tmp[k] << v } }
tmp.transform_values { |k| k.transpose.map(&:sum) }

返回哪个

tmp #=> {:a=>[5, 7, 9], :b=>[8, 10, 2], :c=>[2, 4, 6]}


作为一个衬纸:

(arr.each_with_object(Hash.new{ |k,v| k[v] = [] }) { |h, tmp| h.each { |k,v| tmp[k] << v } }).transform_values { |k| k.transpose.map(&:sum) }