2012-07-04 16 views
5

Creo que esto sería fácil, y he buscado esto bastante duro, pero parece que no puede hacer que funcione.Ordene los hash en el orden alfabético por un campo

que tienen la siguiente almohadilla:

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

estoy tratando de ordenar por orden alfabético por el nombre.

Ahora mismo "estoy haciendo esto:.

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

Sin embargo, sólo se da salida a los resultados completos en orden no alfabético

Respuesta

11

El problema es que a y b son Hash, así que hay que utilizar "nombre" como la clave o el índice de cambio de 0. Entonces esto debería hacerlo

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

¡Recuerde también utilizar sort! modificar @friends variable o configurarlo para que el resultado

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

o

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

funcionaba muy bien. ¡gracias! – user749798

7

Es posible ordenar por una llave, sólo ten en cuenta si la clave es una cadena o un símbolo cuando se hace esto

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

Si usted quiere que sea sensible a mayúsculas, entonces siempre se puede hacer:.

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

Y, por supuesto, siempre puede utilizar ! salvar lo que volver a @friends

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