我有这个哈希数组:
- :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
答案 0 :(得分:92)
&:age
表示group_by
方法应调用数组项上的age
方法以按数据获取组。对于您的案例中的哈希项,未定义此age
方法。
这应该有效:
array.group_by { |d| d[:age] }
答案 1 :(得分: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]}
答案 2 :(得分:1)
正如其他人指出的那样,调用了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