Bagaimana cara mengurutkan array hash dengan nilai di hash?

120

Kode Ruby ini tidak berfungsi seperti yang saya harapkan:

# 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

Saya mencari untuk mengurutkan array hashes dengan kunci "nilai", tetapi mereka dicetak tanpa disortir.

Kaca Ollie
sumber

Jawaban:

215

Ruby sorttidak bisa disortir. (Apakah Anda memiliki latar belakang Python, mungkin?)

Ruby memiliki sort!penyortiran di tempat, tetapi tidak ada varian di tempat untuk sort_bydi Ruby 1.8. Dalam praktiknya, Anda dapat melakukan:

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

Mulai dari Ruby 1.9+, .sort_by!tersedia untuk penyortiran di tempat:

sort_me.sort_by! { |k| k["value"]}
Stéphan Kochen
sumber
28
Sebenarnya, Array#sort_by!Ruby 1.9.2 baru. Tersedia hari ini untuk semua versi Ruby dengan membutuhkan backportspermata saya juga :-)
Marc-André Lafortune
Hai, adakah cara untuk mengurutkan dalam urutan turun juga? Saya pikir saya mungkin ingin pergi 3,2,1...
tekknolagi
2
Anda tidak dapat melakukannya dengan sort_by, tetapi gunakan sortatau sort!dan cukup balik operan: a.sort! {|x,y| y <=> x }( ruby-doc.org/core-1.9.3/Array.html#method-i-sort )
Stéphan Kochen
1
Atau:puts sorted = sort_me.sort_by{ |k,v| v }
Zaz
9
@tekknolagi: Tambahkan saja .reverse.
Zaz
21

Sesuai @shteef tetapi diimplementasikan dengan sort!varian seperti yang disarankan:

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

Meskipun Ruby tidak memiliki sort_byvarian in-place, Anda dapat melakukan:

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

Array.sort_by! ditambahkan di 1.9.2

AG_
sumber
1
Jawaban "Array.sort_by! Telah ditambahkan di 1.9.2" ini berhasil untuk saya
web spider26
2

Anda bisa menggunakan sort_me.sort_by!{ |k| k["value"]}. Ini seharusnya berhasil.

Mukesh Kumar Gupta
sumber