Функция библиотеки Ruby для преобразования Enumerable в Hash - PullRequest
4 голосов
/ 26 января 2011

Рассмотрим это расширение для Enumerable:

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"}

Есть ли встроенная функция, которая уже делает это, или достаточно близко к ней, чтобы это расширение не требовалось?

Ответы [ 2 ]

5 голосов
/ 02 июля 2015

Enumerable.to_h преобразует последовательность [key, value] s в Hash, поэтому вы можете сделать:

people.map {|p| [p[:name], p]}.to_h

Если у вас есть несколько значений, сопоставленных одному и тому же ключу, это сохраняет последнее значение.

5 голосов
/ 26 января 2011
[   {:name=>'fred', :age=>32},
    {:name=>'barney', :age=>42},
].group_by { |person| person[:name] }

=> {"fred"=>[{:name=>"fred", :age=>32}],
   "barney"=>[{:name=>"barney", :age=>42}]}

Ключи имеют форму массивов, чтобы иметь возможность иметь несколько Фредов или Барни, но вы можете использовать .map для восстановления, если вам действительно нужно.

...