Функция библиотеки Ruby для преобразования перечисленного в хэш
-
24-10-2019 - |
Вопрос
Рассмотрим это расширение перечисленным:
module Enumerable
def hash_on
h = {}
each do |e|
h[yield(e)] = e
end
h
end
end
Он используется так:
people = [
{:name=>'fred', :age=>32},
{:name=>'barney', :age=>42},
]
people_hash = people.hash_on { |person| person[:name] }
p people_hash['fred'] # => {:age=>32, :name=>"fred"}
p people_hash['barney'] # => {:age=>42, :name=>"barney"}
Есть ли встроенная функция, которая уже делает это или достаточно близко к ней, чтобы это расширение не нужно?
Решение
Перечисление.to_h преобразует последовательность [key, value]
S в Hash
Итак, вы можете сделать:
people.map {|p| [p[:name], p]}.to_h
Если у вас есть несколько значений, отображенных с одним и тем же ключом, это сохраняет последний.
Другие советы
[ {:name=>'fred', :age=>32},
{:name=>'barney', :age=>42},
].group_by { |person| person[:name] }
=> {"fred"=>[{:name=>"fred", :age=>32}],
"barney"=>[{:name=>"barney", :age=>42}]}
Ключи в форме массивов, чтобы иметь возможность иметь несколько Фреда или Барни, но вы можете использовать .map
реконструировать, если вам действительно нужно.
Не связан с StackOverflow