2012-07-04 11 views
5

Penso che sarebbe facile, e ho cercato questo piuttosto difficile, ma non riesco a farlo funzionare.Ordina hash in ordine alfabetico in base ad un campo

Ho il seguente hash:

@friends = [{"name"=>"John Smith", "id"=>"12345"}, {"name"=>"Jane Doe", "id"=>"23456"}, {"name"=>"Samuel Jackson", "id"=>"34567"}, {"name"=>"Kate Upton", "id"=>"45678"}] 

sto cercando di risolvere in ordine alfabetico per nome.

In questo momento mi "sto facendo questo:.

@friends.sort{|a,b| a[0]<=>b[0]} 

Tuttavia, appena uscite i risultati completi in ordine non alfabetico

risposta

11

Il problema è che a e b sono Hash, quindi bisogna usare "nome" come chiave o un indice, invece di 0. Quindi questo dovrebbe farlo

@friends.sort{|a,b| a['name']<=>b['name']} 

Inoltre ricordarsi di usare sort! modificare @friends variabile o impostarla al risultato

@friends.sort!{|a,b| a['name']<=>b['name']} 

o

@friends = @friends.sort{|a,b| a['name']<=>b['name']} 
+0

funzionava bene. grazie! – user749798

7

E 'possibile ordinare in base a una chiave, basta essere consapevoli se la chiave è una stringa o un simbolo quando si fa questo

@friends.sort_by { |f| f['name'] } 

Se si vuole rendere case insensitive allora si può sempre fare.

012.
@friends.sort_by { |f| f['name'].downcase } 

E naturalmente si può sempre usare ! per salvare che torna a @friends

>> @friends.sort_by! { |f| f['name'] } 
>> @friends # now returns the sorted array of hashes 
Problemi correlati