在哈希数组中添加相同Key的值

时间:2016-03-15 07:31:10

标签: arrays ruby hash hashmap

尝试添加相同键的值但迭代它。这是我的数组

arr = [ {a: 10, b: 5, c: 2}, {a: 5, c: 3}, { b: 15, c: 4}, {a: 2}, {} ]

想要将其转换为

{a: 17, b: 20, c: 9} 

3 个答案:

答案 0 :(得分:6)

以下是使用Enumerable#reduceHash#merge执行此操作的一种方法:

arr.reduce {|acc, h| acc.merge(h) {|_,v1,v2| v1 + v2 }}
#=> {:a=>17, :b=>20, :c=>9}

答案 1 :(得分:4)

each_with_object救援:

result = arr.each_with_object(Hash.new(0)) do |hash, result|
  hash.each { |key, value| result[key] += value}
end

p result

答案 2 :(得分:4)

#1使用"计算哈希"

编辑:我刚刚注意到@Pascal之前发布了相同的解决方案。我将离开我的解释。

arr.each_with_object(Hash.new(0)) { |h,g| h.each { |k,v| g[k] += v } }
  #=> {:a=>17, :b=>20, :c=>9} 

h = Hash.new(0)是一个计数哈希值,默认值为零。这意味着,如果h没有密钥k,则h[k]将返回零(但散列不会更改)。 Ruby将h[k] += 4扩展为h[k] = h[k] + 4,因此如果h没有键k,则等式右侧的h[k]等于零。

#2使用Hash#update

具体来说,使用此方法的形式(aka merge!),该方法使用块来确定合并的两个哈希中存在的键的值。

arr.each_with_object({}) { |h,g| g.update(h) { |_,o,n| o+n } }
  #=> {:a=>17, :b=>20, :c=>9}