簡體   English   中英

如何通過相同的鍵組合數組中多個哈希的值

[英]How to combine the value of multiple hashes within an array by the same key

我有一系列的哈希像這樣:

[{"apple"=>5}, {"banana"=>4}, {"orange"=>6}, {"apple"=>4}, {"orange"=>2}]

我怎么做到:

[{"apple"=>9}, {"banana"=>4}, {"orange"=>8}]

還有:

cache = Hash.new { |h, k| h[k] = { k => 0 } }
aoh.flat_map(&:to_a)
   .each_with_object(cache) { |(k,v),h| h[k][k] += v }
   .values

或者更多的部分更清楚一點:

cache   = Hash.new { |h, k| h[k] = { k => 0 } }
sum     = -> ((k, v), h) { h[k][k] += v }
summary = aoh.flat_map(&:to_a)
             .each_with_object(cache, &sum)
             .values

看起來有點奇怪的cache Hash同時做兩件事:

  1. 跟蹤其鍵中到目前為止看到的鍵。
  2. 跟蹤我們想要的最終結果。

你會很快看到很多方法。 這是一個:

arr = [{"apple"=>5}, {"banana"=>4}, {"orange"=>6}, {"apple"=>4}, {"orange"=>2}]

arr.flat_map(&:to_a)
   .group_by(&:first)
   .map { |k,a| { k=>(a.reduce(0) { |tot,(_,v)| tot+v }) } } 
  #=> [{"apple"=>9}, {"banana"=>4}, {"orange"=>8}]

步驟:

a = arr.flat_map(&:to_a)
  #=> [["apple",5], ["banana",4], ["orange",6], ["apple",4], ["orange",2]] 
b = a.group_by(&:first)
  #=> {"apple"=>[["apple", 5], ["apple", 4]],
  #   "banana"=>[["banana", 4]],
  #   "orange"=>[["orange", 6], ["orange", 2]]} 
b.map { |k,a| { k=>(a.reduce(0) { |tot,(_,v)| tot+v }) } }
  #=> [{"apple"=>9}, {"banana"=>4}, {"orange"=>8}] 

讓我們仔細看看b.map

enum = b.map
  #=> #<Enumerator: {
  #     "apple"=>[["apple", 5], ["apple", 4]],
  #     "banana"=>[["banana", 4]],
  #     "orange"=>[["orange", 6], ["orange", 2]]
  #   }:map> 

enum的第一個元素(通過Enumerator#each ,它又調用Array#each )傳遞給塊並分配給塊變量。 我們可以使用Enumerator#next來模擬它:

 k,a = enum.next
   #=> ["apple", [["apple", 5], ["apple", 4]]]
 k #=> "apple"
 a #=> [["apple", 5], ["apple", 4]]

計算:

 c = a.reduce(0) { |tot,(_,v)| tot+v }
   #=> 9

的第一個元素a被傳遞到塊和塊變量被分配:

 tot, (_,v) = 0, ["apple", 5]
     #=> [0, ["apple", 5]] 
 tot #=> 0
 v   #=> 5

然后我們計算:

 tot + 5
   #=> 0+5 => 5

返回以reduce以成為tot的更新值。 的第二值a傳入:

 tot, (_,v) = 5, ["apple", 4]
 tot #=> 5
 v   #=> 4

我們計算並返回:

 tot+4
   # 5+4 => 9

所以:

 { k=>tot }
   #=> { "apple"=>9 }

a的第一個元素的映射值。 其余映射值的計算方法類似。

暫無
暫無

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

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