Wie sortiere ich ein Array von Hashes nach einem Wert im Hash?

119

Dieser Ruby-Code verhält sich nicht so, wie ich es erwarten würde:

# 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

Ich möchte das Array der Hashes nach dem Schlüssel "Wert" sortieren, aber sie werden unsortiert gedruckt.

Ollie Glass
quelle

Antworten:

214

Ruby's sortsortiert nicht an Ort und Stelle. (Haben Sie vielleicht einen Python-Hintergrund?)

Ruby hat sort!für die In-Place-Sortierung, aber es gibt keine In-Place-Variante für sort_byRuby 1.8. In der Praxis können Sie Folgendes tun:

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

Ab Ruby 1.9+ .sort_by!steht die direkte Sortierung zur Verfügung:

sort_me.sort_by! { |k| k["value"]}
Stéphan Kochen
quelle
28
Ist eigentlich Array#sort_by!neu in Ruby 1.9.2. Heute für alle Ruby-Versionen verfügbar, da auch mein backportsJuwel benötigt wird :-)
Marc-André Lafortune
Hallo, gibt es auch eine Möglichkeit, in absteigender Reihenfolge zu sortieren? Ich 3,2,1
glaube,
2
Sie können das nicht tun sort_by, aber verwenden Sie sortoder sort!und drehen Sie einfach die Operanden um: a.sort! {|x,y| y <=> x }( ruby-doc.org/core-1.9.3/Array.html#method-i-sort )
Stéphan Kochen
1
Oder:puts sorted = sort_me.sort_by{ |k,v| v }
Zaz
9
@tekknolagi: Einfach anhängen .reverse.
Zaz
21

Wie bei @shteef, aber mit der vorgeschlagenen sort!Variante implementiert :

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

Obwohl Ruby keine sort_byIn-Place-Variante hat, können Sie Folgendes tun:

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

Array.sort_by! wurde in 1.9.2 hinzugefügt

AG_
quelle
1
Diese "Array.sort_by! Wurde in 1.9.2 hinzugefügt" Antwort funktionierte für mich
Web Spider26
2

Sie können verwenden sort_me.sort_by!{ |k| k["value"]}. Das sollte funktionieren.

Mukesh Kumar Gupta
quelle