Techioz Blog

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

概要

このハッシュの配列があります:

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

年齢別にグループ化する必要があるので、次のようになります。

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 を使用しています

解決策

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

これは機能するはずです:

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

新しい Ruby バージョンでは、次のショートカットも使用できます。

array.group_by { _1[:age] }

ここでの _1 は、#group_by メソッドに渡されるブロックの最初の位置引数を反映します。