¿Cómo clasifico una matriz de hash por un valor en el hash?

120

Este código Ruby no se comporta como esperaba:

# create an array of hashes
sort_me = []
sort_me.push({"value"=>1, "name"=>"a"})
sort_me.push({"value"=>3, "name"=>"c"})
sort_me.push({"value"=>2, "name"=>"b"})

# sort
sort_me.sort_by { |k| k["value"]}

# same order as above!
puts sort_me

Estoy buscando ordenar la matriz de hashes por la clave "valor", pero se imprimen sin clasificar.

Ollie Glass
fuente

Respuestas:

215

Ruby sortno se clasifica en el lugar. (¿Tienes experiencia en Python, quizás?)

Ruby tiene sort!para la clasificación en el lugar, pero no hay una variante en el lugar para sort_byRuby 1.8. En la práctica, puede hacer:

sorted = sort_me.sort_by { |k| k["value"] }
puts sorted

A partir de Ruby 1.9+, .sort_by!está disponible para clasificación in situ:

sort_me.sort_by! { |k| k["value"]}
Stéphan Kochen
fuente
28
De hecho, Array#sort_by!es nuevo en Ruby 1.9.2. Disponible hoy para toda la versión Ruby requiriendo mi backportsgema también :-)
Marc-André Lafortune
Hola, ¿hay alguna forma de ordenar en orden descendente también? Supongo que podría querer ir 3,2,1...
tekknolagi
2
No puede hacer eso con sort_by, pero use sorto sort!y simplemente cambie los operandos: a.sort! {|x,y| y <=> x }( ruby-doc.org/core-1.9.3/Array.html#method-i-sort )
Stéphan Kochen
1
O:puts sorted = sort_me.sort_by{ |k,v| v }
Zaz
9
@tekknolagi: Solo agregue .reverse.
Zaz
21

Según @shteef pero implementado con la sort!variante como se sugiere:

sort_me.sort! { |x, y| x["value"] <=> y["value"] }
bjg
fuente
7

Aunque Ruby no tiene una sort_byvariante local, puede hacer:

sort_me = sort_me.sort_by { |k| k["value"] }

Array.sort_by! fue agregado en 1.9.2

AG_
fuente
1
Esta respuesta "Array.sort_by! Se agregó en 1.9.2" funcionó para mí
web spider26 de
2

Puede utilizar sort_me.sort_by!{ |k| k["value"]}. Esto debería funcionar.

Mukesh Kumar Gupta
fuente