Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как преобразовать в Ruby список пар ключ-значение в хэш, чтобы значения с повторяющимися ключами сохранялись в массиве?

Автор вопроса: GussОтветов: 2

Учитывая пары ключ-значение списка, в виде массива массивов - например. [ ["key1","value1"], ["key2","value2"], ["key1", "value3"] ], как самым элегантным образом преобразовать их в хэш, в котором хранятся все значения?

Для приведенного выше примера я хотел бы получить { "key1" => [ "value1", "value3" ], "key2" => [ "value2" ] }.

  • Этот вопрос уже был stackoverflow.com/questions/9270972/ Ruslan Kornienko 24.07.2015
  • Я не нашел его, когда искал, и этот вопрос не совсем то, что мне нужно, хотя в утвержденном ответе есть то, что мне нужно, и если бы я видел его раньше, я бы не задал вопрос :-) Guss 24.07.2015

rubydictionarykey-value

Ответы

Ответ 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

Что я считаю не очень хорошо.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы