Подтвердить что ты не робот

Как я могу группировать этот массив хешей?

У меня есть этот массив хэшей:

- :name: Ben
  :age: 18
- :name: David
  :age: 19
- :name: Sam
  :age: 18

Мне нужно сгруппировать их с помощью age, поэтому они заканчиваются так:

18:
- :name: Ben
  :age: 18
- :name: Sam
  :age: 18
19:
- :name: David
  :age: 19

Я пробовал делать это так:

array = array.group_by &:age

но я получаю эту ошибку:

NoMethodError (undefined method `age' for {:name=>"Ben", :age=>18}:Hash):

Что я делаю неправильно? Я использую Rails 3.0.1 и Ruby 1.9.2

4b9b3361

Ответ 1

&:age означает, что метод group_by должен вызывать метод age для элементов, чтобы получить группу по данным. Этот метод age не определен для элементов, которые являются хешами.

Это должно работать:

array.group_by { |d| d[:age] }

Ответ 2

out = {}
array_of_hashes.each do |a_hash|
  out[a_hash[:age]] ||= []
  out[a_hash[:age]] << a_hash
end

или

array.group_by {|item| item[:age]}

Ответ 3

Как указывали другие, метод ruby ​​ Symbol#to_proc вызывается и вызывает метод age для каждого хэша в массиве. Проблема здесь в том, что хеши не реагируют на метод age.

Теперь мы можем определить один для класса Hash, но мы, вероятно, не хотим его для каждого экземпляра хэша в программе. Вместо этого мы можем просто определить метод age для каждого хэша в массиве следующим образом:

array.each do |hash|
  class << hash
    def age
      self[:age]
    end
  end
end

И тогда мы можем использовать group_by так же, как вы были раньше:

array = array.group_by &:age