簡體   English   中英

合並Ruby中的哈希數組並計算相同的鍵

[英]Merge an array of hashes in Ruby and count the same key

我有這種格式的一些數據

[{
    "_id" => "20",
    "value" => 1
}, {
    "_id" => "19",
    "value" => 1
}, {
    "_id" => nil,
    "value" => 8
}, {
    "_id" => "27",
    "value" => 1
}, {
    "_id" => "25",
    "value" => 3
}, {
    "_id" => "28",
    "value" => 1
}]

我想將相同的值與“_id”鍵合並,並將“值”值相加。

欲望輸出

[{
    "_id" => "20",
    "value" => 1
}, {
    "_id" => "19",
    "value" => 2
}, {
    "_id" => nil,
    "value" => 8
}, ...]

有一種優雅的方式來做到這一點?

我試過兩個循環,但我認為這不是最好的方法。

與Ruby中的大多數內容一樣,訪問Enumerable文檔會調出group_by方法,該方法可以通過某些任意標准幫助將事物組合在一起。 將它與總和的東西結合起來就可以得到:

v.group_by do |e|
  e['_id']
end.map do |id, list|
  {
    '_id' => id,
    'value' => list.inject(0) { |sum, e| sum + e['value'] }
  }
end

# => [{"_id"=>"20", "value"=>1}, {"_id"=>"19", "value"=>2}, {"_id"=>nil, "value"=>28},
#     {"_id"=>"27", "value"=>1}, {"_id"=>"25", "value"=>3}, {"_id"=>"28", "value"=>1},
#     {"_id"=>"23", "value"=>1}, {"_id"=>"16", "value"=>1}, {"_id"=>"18", "value"=>2},
#     {"_id"=>"22", "value"=>2}]
arr = [{ "_id" => "20", "value" => 1 },
       { "_id" => "19", "value" => 1 },
       { "_id" =>  nil, "value" => 8 },
       { "_id" => "20", "value" => 1 },
       { "_id" => "25", "value" => 3 },
       { "_id" => "19", "value" => 1 },
      ]

h = arr.each_with_object(Hash.new(0)) { |g,h| h[g["_id"]] += g["value"] }
  #=> {"20"=>2, "19"=>2, nil=>8, "25"=>3}

如果你想要返回一個具有"_id"唯一值的哈希數組並更新"value"的值,你可以先計算h ,然后

arr.uniq { |g| g["_id"] }.map { |g| g.update("_id"=>h[g["_id"]]) }
  #=> [{"_id"=>"20", "value"=>2}, {"_id"=>" 19", "value"=>2},
  #    {"_id"=>nil, "value"=>8}, {"_id"=>"25", "value"=>3}]  

這使用方法Array#uniq和一個塊, Enumerable #mapHash #update (aka merge! )。

或者,您可以編寫以下內容。

arr.each_with_object({}) { |g,h|
  h.update(g["_id"]=>g) { |_,o,n| o.merge("value"=>o["value"]+n["value"]) } }.values
  #=> [{"_id"=>"20", "value"=>2}, {"_id"=>" 19", "value"=>2},
  #    {"_id"=>nil, "value"=>8}, {"_id"=>"25", "value"=>3}]  

同樣,我使用了Hash#update ,但這次我使用了一個塊來確定兩個哈希中合並的鍵的值。 另請參見Enumerable#each_with_objectHash #incoration 注意,作為參數, (k=>v)({ k=>v })簡寫。

暫無
暫無

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

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