簡體   English   中英

在數組中合並具有相同鍵值對的哈希

[英]Merge hashes with same key value pair inside array

如何合並具有相同鍵,值對的數組中的哈希? 我有以下數組,

arry = [{"id" => 1, "val1" => 123},
        {"id" => 2, "val1" => 234},
        {"id" => 1, "val2" => 321},
        {"id" => 1, "val3" => 445},
        {"id" => 3, "val3" => 334}]

想得到

arry = [{"id" => 1, "val1" => 123, "val2" => 321, "val3" => 445},
        {"id" => 2, "val1" => 234},
        {"id" => 3, "val3" => 334}]

有紅寶石的方法嗎? 嘗試了幾種方法,但到目前為止沒有成功。

首先,您發布的arry不是有效的紅寶石數組(我在編輯中將其修復。)

arry.
  group_by { |h| h["id"] }.
  values.
  map { |a| a.reduce(&:merge) }
#⇒ [{"id"=>1, "val1"=>123, "val2"=>321, "val3"=>445},
#   {"id"=>2, "val1"=>234}, {"id"=>3, "val3"=>334}]

如果您的輸入可能在相同的"id"具有相同的鍵(例如{"id" => 1, "val1" => 123}, {"id" => 1, "val1" => 456} ),您就是決定如何合並它們。 無論如何,將Hash#merge與塊一起成為您的朋友。

arry.each_with_object({}) { |g,h| h.update(g["id"]=>g) { |_,o,n| o.merge(n) } }.values
  #=> [{"id"=>1, "val1"=>123, "val2"=>321, "val3"=>445},
  #    {"id"=>2, "val1"=>234},
  #    {"id"=>3, "val3"=>334}] 

請注意, values的接收者為:

{1=>{"id"=>1, "val1"=>123, "val2"=>321, "val3"=>445},
 2=>{"id"=>2, "val1"=>234},
 3=>{"id"=>3, "val3"=>334}} 

這使用采用塊{ |_,o,n| o.merge(n) }Hash#update (也稱為merge )形式。 { |_,o,n| o.merge(n) }來確定合並的兩個哈希中存在的鍵的值。 有關三個塊變量的說明,請參見文檔。 (我在第一個通用鍵上使用了下划線,以表示在塊計算中未使用下划線。)

這也應該起作用

arry.group_by { |a| a['id'] }.map{|_, ar| ar.reduce(:merge)}

這會回來,

[{"id"=>1, "val1"=>123, "val2"=>321, "val3"=>445}, {"id"=>2, "val1"=>234}, {"id"=>3, "val3"=>334}]

暫無
暫無

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

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