Come faccio a ordinare un array di hash in base a un valore nell'hash?


120

Questo codice Ruby non si comporta come mi aspetterei:

# 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

Sto cercando di ordinare l'array di hash in base alla chiave "valore", ma vengono stampati non ordinati.

Risposte:


215

Ruby sortnon effettua l'ordinamento sul posto. (Hai uno sfondo Python, forse?)

Ruby ha sort!per l'ordinamento sul posto, ma non esiste una variante sul posto per sort_byRuby 1.8. In pratica puoi fare:

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

A partire da Ruby 1.9+, .sort_by!è disponibile per l'ordinamento sul posto:

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

28
In realtà, Array#sort_by!è nuovo in Ruby 1.9.2. Disponibile oggi a tutte le versioni Ruby richiedendo anche la mia backportsgemma :-)
Marc-André Lafortune

Ciao, c'è anche un modo per ordinare in ordine decrescente? Immagino che potrei voler andare 3,2,1...
tekknolagi

2
Non puoi farlo con sort_by, ma usa sorto sort!e semplicemente capovolgi gli operandi: a.sort! {|x,y| y <=> x }( ruby-doc.org/core-1.9.3/Array.html#method-i-sort )
Stéphan Kochen

1
Oppure:puts sorted = sort_me.sort_by{ |k,v| v }
Zaz

9
@tekknolagi: basta aggiungere .reverse.
Zaz

21

Come per @shteef ma implementato con la sort!variante come suggerito:

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

7

Sebbene Ruby non abbia una sort_byvariante sul posto, puoi fare:

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

Array.sort_by! è stato aggiunto in 1.9.2


1
Questa risposta "Array.sort_by! È stata aggiunta nella 1.9.2" ha funzionato per me
web spider26

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.