2011-08-21 38 views
30

Tôi có mảng này băm:Tôi có thể nhóm mảng băm này như thế nào?

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

tôi cần phải nhóm chúng bởi age, vì vậy họ kết thúc như thế này:

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

Tôi đã thử làm theo cách này:

array = array.group_by &:age 

nhưng tôi gặp phải lỗi này:

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

Tôi đang làm gì sai? Tôi đang sử dụng Rails 3.0.1 và Ruby 1.9.2

Trả lời

77

&:age có nghĩa là phương pháp group_by sẽ gọi phương thức age trên các mục để nhận nhóm theo dữ liệu. Phương thức age này không được xác định trên các mục bị Hashes.

này nên làm việc:

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 

hoặc

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

Như những người khác đã chỉ ra phương pháp Symbol#to_proc ruby ​​được gọi và gọi phương thức age trên mỗi băm trong mảng. Vấn đề ở đây là các băm không đáp ứng phương thức age.

Bây giờ chúng ta có thể định nghĩa một cho lớp Hash, nhưng có lẽ chúng ta không muốn nó cho mọi cá thể băm trong chương trình. Thay vào đó chúng ta có thể dễ dàng xác định các phương pháp age trên mỗi băm trong mảng như vậy:

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

Và sau đó chúng ta có thể sử dụng group_by cũng giống như bạn là trước đây:

array = array.group_by &:age 
Các vấn đề liên quan