web-dev-qa-db-ja.com

このハッシュ配列をグループ化するにはどうすればよいですか?

私はこのハッシュの配列を持っています:

- :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

35
ben

&:ageは、group_byメソッドは、配列項目でageメソッドを呼び出して、データごとにグループを取得する必要があります。このageメソッドは、あなたの場合ハッシュであるアイテムには定義されていません。

これは動作するはずです:

array.group_by { |d| d[:age] }
93
KARASZI István
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]}
2

他の人がRubyのSymbol#to_procメソッドが呼び出され、配列内の各ハッシュでageメソッドを呼び出します。ここでの問題は、ハッシュがageメソッドに応答しないことです。

これで、Hashクラスに1つ定義できますが、おそらくプログラムのすべてのハッシュインスタンスに1つは必要ありません。代わりに、配列の各ハッシュでageメソッドを次のように定義するだけです。

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

そして、group_by前と同じように:

array = array.group_by &:age
1
gunn