Можно использовать форму Hash # update (он же merge!
) и Hash # merge , который использует блок для определения значений ключей, присутствующих в обоих хешахбыть объединеннымЗдесь это должно быть сделано на двух уровнях.
Позволяя arr
быть массивом, данным в вопросе, эти методы используются следующим образом.
arr.each_with_object({}) do |g,h|
h.update(g['abc_id']=>g) do |_,o,n|
o.merge(n) { |k,oo,nn| k=='def_id' ? oo+nn : oo }
end
end.values
#=> [{"abc_id"=>"1234", "def_id"=>["33", "44"]},
# {"abc_id"=>"5678", "def_id"=>["11", "22", "55", "66"]}]
См. Документацию для объясненияпеременных блока _
, o
, n
, k
, oo
и nn
.Я использовал подчеркивание для представления общего ключа с update
, чтобы сообщить читателю, что он не используется в расчете блока.
Обратите внимание, что получатель Hash # values следующий.
{ "1234"=>{ "abc_id"=>"1234", "def_id"=>["33", "44"] },
"5678"=>{ "abc_id"=>"5678", "def_id"=>["11", "22", "55", "66"] } }