Вы можете использовать форму Hash # update (он же merge!
), который использует блок для определения значений ключей, которые присутствуют в обоих объединяемых хэшах:
books.each_with_object({}) do |g,h|
h.update(g['author']=>g['sales']) { |_,o,n| o+n }
end.map { |k,v| { 'author'=>k, 'total_sales'=>v } }
#=> [{"author"=>"John Doe", "total_sales"=>1200},
# {"author"=>"George Doe", "total_sales"=>1400}]
См. Do c для описания переменных блока _
, o
и n
. (Я использовал _
для общего ключа, главным образом, чтобы сообщить читателю, что он не используется в расчете блока, обычном Ruby соглашении.)
Подумайте об остановке после того, как ha sh построено:
books.each_with_object({}) do |g,h|
h.update(g['author']=>g['sales']) { |_,o,n| o+n }
end
#=> {"John Doe"=>1200, "George Doe"=>1400}