Saya memiliki berbagai objek di Ruby on Rails. Saya ingin mengurutkan array berdasarkan atribut objek. Apa itu mungkin?
129
Saya merekomendasikan menggunakan sort_by sebagai gantinya:
objects.sort_by {|obj| obj.attribute}
Apalagi jika atribut bisa dihitung.
Atau pendekatan yang lebih ringkas:
objects.sort_by(&:attribute)
objects.sort_by(&:attribute)
objects.sort_by { |obj| obj.attribute.downcase }
sort!
(misalnya kecepatan, dll.)?Ya, menggunakan
Array#sort!
ini mudah.sumber
<=>
? Jenis kesalahan apa yang Anda dapatkan? dll, dll, mual iklan. Dengan kata lain, kita membutuhkan lebih banyak detail daripada "tapi tidak beruntung bagi saya".sort
jika Anda ingin mempertahankan aslinya dan menetapkan hasilnya ke objek yang berbeda; jika tidak, gunakan varian di tempatsort!
,. Faktanya,sort
memanggil secarasort!
internal, setelah menyalin objek asli.sort!
akan bekerja dengan baik, dan selalu (!) Melakukan hal yang sama seperti yang Anda tulis.Urutan menaik:
atau
Urutan menurun:
atau
sumber
jika Anda perlu mengurutkan berdasarkan dua atribut, di mana yang pertama lebih penting daripada yang kedua (berarti memperhitungkan argumen kedua hanya jika argumen pertama sama), maka Anda dapat melakukan seperti ini
atau dalam kasus array array
sumber
Anda dapat membuat kelas apa pun dapat diurutkan dengan mengganti metode <=>:
Sekarang array objek Person akan dapat diurutkan di last_name.
sumber
Array # sort berfungsi dengan baik, seperti yang diposting di atas:
TAPI, Anda perlu memastikan bahwa
<=>
operator diimplementasikan untuk atribut itu. Jika itu adalah tipe data asli Ruby, ini bukan masalah. Jika tidak, tulis implementasi Anda sendiri yang mengembalikan -1 jika a <b, 0 jika sama, dan 1 jika a> b.sumber
Lebih elegan
objects.sort_by(&:attribute)
, Anda dapat menambahkan.reverse
jika Anda perlu mengganti urutan.sumber
Iya itu mungkin
http://ariejan.net/2007/01/28/ruby-sort-an-array-of-objects-by-an-attribute/
sumber
sumber
sort
saat Anda mengurutkan objek yang tidak dapat dibandingkan secara langsung. Jika Anda harus mengakses atribut atau melakukan perhitungan untuk mendapatkan nilai yang akan dibandingkan, gunakansort_by
. Ini akan jauh lebih cepat.