Учитывая пары ключ-значение списка, в виде массива массивов - например. [ ["key1","value1"], ["key2","value2"], ["key1", "value3"] ], как самым элегантным образом преобразовать их в хэш, в котором хранятся все значения?
Для приведенного выше примера я хотел бы получить { "key1" => [ "value1", "value3" ], "key2" => [ "value2" ] }.
Ответ 1 · рейтинг 1 · Cary Swoveland
Другой способ - использовать форму Hash#update (также известный как merge!), который использует блок для определения значений ключей, находящихся в обоих объединяемых хэшах.
arr = [ ["key1","value1"], ["key2","value2"], ["key1", "value3"] ]
arr.each_with_object({}) { |(k,v),h| h.update(k=>[v]) { |_,o,n| o+n } }
#=> {"key1"=>["value1", "value3"], "key2"=>["value2"]}
Ответ 2 · рейтинг -1 · Guss
Мое лучшее решение на данный момент таково:
kvlist.inject(Hash.new([])) do |memo,a|
memo[a[0]] = (memo[a[0]] << a[1])
memo
end
Что я считаю не очень хорошо.