簡體   English   中英

在哈希數組中添加相同Key的值

[英]Add values of same Key in array of hashes

嘗試添加相同鍵的值,但要對其進行迭代。 這是我的數組

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

想將其轉換為

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

這是通過使用Enumerable#reduceHash#merge做到這一點的一種方法:

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

each_with_object進行救援:

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

p result

#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使用哈希值#update

具體來說,使用此方法的形式(也稱為merge! ),該方法采用一個塊來確定要合並的兩個哈希中都存在的鍵的值。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM