Я хотел бы предложить способ рассмотреть также случай, когда price
или clearance
одного и того же продукта (String
) могут отличаться (поскольку вы не имеете дело с идентификаторами базы данных):
cart_items = [
{"AVOCADO" => {:price => 3.0, :clearance => true }},
{"AVOCADO" => {:price => 4.0, :clearance => false }},
{"AVOCADO" => {:price => 3.0, :clearance => true }},
{"AVOCADO" => {:price => 4.0, :clearance => true }},
{"KALE" => {:price => 3.0, :clearance => false}},
{"AVOCADO" => {:price => 4.0, :clearance => true }},
{"AVOCADO" => {:price => 4.0, :clearance => true }}
]
В этом случае это возможный способ консолидации:
cart_items.map{ |h| h.values.first.merge(product: h.keys.first) }
.group_by(&:itself)
.transform_values { |v| v.first.merge(count: v.size)}.values
Возвращается:
#=> [{:price=>3.0, :clearance=>true, :product=>"AVOCADO", :count=>2}, {:price=>4.0, :clearance=>false, :product=>"AVOCADO", :count=>1}, {:price=>4.0, :clearance=>true, :product=>"AVOCADO", :count=>3}, {:price=>3.0, :clearance=>false, :product=>"KALE", :count=>1}]
Вы всегда можете добавить .group_by{ |h| h[:product] }
, чтобы получить
#=> {"AVOCADO"=>[{:price=>3.0, :clearance=>true, :product=>"AVOCADO", :count=>2}, {:price=>4.0, :clearance=>false, :product=>"AVOCADO", :count=>1}, {:price=>4.0, :clearance=>true, :product=>"AVOCADO", :count=>3}], "KALE"=>[{:price=>3.0, :clearance=>false, :product=>"KALE", :count=>1}]}
Или за корзину в вашем посте:
#=> {"AVOCADO"=>[{:price=>3.0, :clearance=>true, :product=>"AVOCADO", :count=>2}], "KALE"=>[{:price=>3.0, :clearance=>false, :product=>"KALE", :count=>1}]}
Не совсем такой же вывод, как требуется, но, возможно, это может быть полезно. Или нет.