Я новичок в Ruby и пытаюсь решить проблему. У меня есть массив хэшей:Здание хэш из массива хешей
list = [{"amount"=>2.25,"rel_id"=>1103, "date"=>"2012-12-21"},
{"amount"=>2.75,"rel_id"=>1103, "date"=>"2012-12-24"},
{"amount"=>2.85,"rel_id"=>666, "date"=>"2012-12-27"},
{"amount"=>3.15,"rel_id"=>666, "date"=>"2012-12-28"}
#and many many more..
]
Мне нужно сгруппировать их по rel_id, что я мог видеть общую сумму и дату они были даны, в такого рода формате:
{1103=>{:total_amount=>5.0, :dates=>["2012-12-21", "2012-12-24"]}, 666=>{:total_amount=>6.0, :dates=>["2012-12-27", "2012-12-28"]}}
Я решил эту таким образом, но я уверен, что это один из худших подход, чтобы сделать это, и я думаю, что это не рубин способ ..
results = {}
list.each do |line|
if !(results.has_key?(line["rel_id"]))
results[line["rel_id"]]={:total_amount=>line["amount"],:dates=>[line["date"]]}
else
results[line["rel_id"]][:total_amount] = results[line["rel_id"]][:total_amount]+line["amount"]
results[line["rel_id"]][:dates]<<line["date"]
end
end
может быть, вы могли бы дать мне или объяснить, как реализовать лучше, более красивый подход в рубине путь?
Очень хорошее решение ... –
Из любопытства, что делает || = делать? –
@Tall Paul, если значение для ключа равно нулю, например. он не существует, || = устанавливает хэш-ключ в значение справа. Почти то же самое, что: 'hash [key] = 0, если hash [key] .nil? 'Тестирование для nil на самом деле более точно, потому что оба значения nil и false вызовут || = для установки значения для ключа. – 7stud