Это решение сначала создает хэш, ключами которого являются уникальные значения g[:studio]
для всех хешей g
в collection
, а значения которого являются суммами g[:worldwide_gross]
для всех g
для данного ключа. Затем этот хэш преобразуется в нужный хэш.
collection.each_with_object(Hash.new(0)) do |g,h|
h[g[:studio]] += g[:worldwide_gross]
end.map { |k,v| { studio: k, worldwide_gross: v } }
#=> [{:studio=>"Alpha Films", :worldwide_gross=>40},
# {:studio=>"Omega Films", :worldwide_gross=>30}]
Два шага следующие:
h = collection.each_with_object(Hash.new(0)) do |g,h|
h[g[:studio]] += g[:worldwide_gross]
end
#=> {"Alpha Films"=>40, "Omega Films"=>30}
h.map { |k,v| { studio: k, worldwide_gross: v } }
#=> [{:studio=>"Alpha Films", :worldwide_gross=>40},
# {:studio=>"Omega Films", :worldwide_gross=>30}]
Вычисление h
(иногда называемое подсчетом хэша)) использует форму Hash :: new , которая определяет значение по умолчанию (здесь ноль), которое является значением, возвращаемым h[k]
для хеша h
, так чтоопределяется, когда h
не имеет ключа k
. Это эквивалентно следующему.
h = collection.each_with_object({}) do |g,h|
h[g[:studio]] = (h[g[:studio]] || 0) + g[:worldwide_gross]
end
Если h
не имеет ключа g[:studio]
, тогда h[g[:studio]] #=> nil
, поэтому h[g[:studio]] || 0 #=> 0
. Если h
имеет ключ g[:studio]
(значение которого не nil
или false
), тогда h[g[:studio]] || 0 #=> h[g[:studio]]
.