Функция библиотеки Ruby для преобразования перечисленного в хэш

StackOverflow https://stackoverflow.com/questions/4807670

  •  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 реконструировать, если вам действительно нужно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top