如何对这个哈希数组进行分组?

时间:2011-08-21 07:17:01

标签: ruby-on-rails ruby ruby-on-rails-3 group-by

我有这个哈希数组:

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

3 个答案:

答案 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