2011-08-21 13 views
30

Ho questo array di hash:Come posso raggruppare questo array di hash?

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

ho bisogno di raggrupparli per age, in modo da finire in questo modo:

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

Ho provato a farlo in questo modo:

array = array.group_by &:age 

ma ottengo questo errore:

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

Cosa sto sbagliando? Utilizzo Rails 3.0.1 e Ruby 1.9.2

risposta

77

Il &:age significa che il metodo group_by deve chiamare il metodo age sugli elementi per ottenere il gruppo in base ai dati. Questo metodo age non è definito sugli elementi che sono Hash.

Questo dovrebbe funzionare:

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 

o

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

Come altri hanno fatto notare il metodo di ruby ​​Symbol#to_proc viene richiamato e chiama il metodo age su ogni hash nella matrice. Il problema qui è che gli hash non rispondono a un metodo age.

Ora potremmo definirne uno per la classe di hash, ma probabilmente non lo vogliamo per ogni istanza di hash nel programma. Invece possiamo semplicemente definire il metodo age su ogni hash nella matrice in questo modo:

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

E poi possiamo usare group_by proprio come eri prima:

array = array.group_by &:age 
Problemi correlati