Apa cara paling elegan untuk memilih objek dalam larik yang unik sehubungan dengan satu atau beberapa atribut?
Objek-objek ini disimpan di ActiveRecord jadi menggunakan metode AR juga tidak masalah.
ruby-on-rails
ruby
arrays
unique
sutee
sumber
sumber
require 'backports'
:-)@photos.uniq &:album_id
Tambahkan
uniq_by
metode ke Array dalam proyek Anda. Ini bekerja dengan analogi dengansort_by
. Begituuniq_by
juga denganuniq
apasort_by
adanyasort
. Pemakaian:Pelaksanaan:
Perhatikan bahwa ini mengembalikan larik baru daripada mengubah larik Anda saat ini. Kami belum menulis
uniq_by!
metode tetapi harus cukup mudah jika Anda mau.EDIT: Tribalvibes menunjukkan bahwa penerapannya adalah O (n ^ 2). Lebih baik menjadi sesuatu seperti (belum teruji) ...
sumber
Lakukan di level database:
sumber
Anda dapat menggunakan trik ini untuk memilih unik dengan beberapa elemen atribut dari array:
sumber
Saya awalnya menyarankan menggunakan
select
metode pada Array. Yakni:[1, 2, 3, 4, 5, 6, 7].select{|e| e%2 == 0}
memberi kami[2,4,6]
kembali.Tetapi jika Anda menginginkan objek seperti itu pertama, gunakan
detect
.[1, 2, 3, 4, 5, 6, 7].detect{|e| e>3}
memberi kami4
.Saya tidak yakin apa tujuan Anda di sini.
sumber
Saya suka penggunaan Hash oleh jmah untuk menegakkan keunikan. Berikut beberapa cara lagi untuk menguliti kucing itu:
Itu 1-liner yang bagus, tapi saya rasa ini mungkin sedikit lebih cepat:
sumber
Jika saya memahami pertanyaan Anda dengan benar, saya telah mengatasi masalah ini menggunakan pendekatan semu-hacky untuk membandingkan objek Marshaled untuk menentukan apakah ada atribut yang bervariasi. Injeksi di akhir kode berikut akan menjadi contoh:
sumber
Cara paling elegan yang saya temukan adalah spin-off menggunakan
Array#uniq
dengan satu blok… Terbaca lebih baik juga!
sumber
Anda dapat menggunakan hash, yang hanya berisi satu nilai untuk setiap kunci:
sumber
Gunakan Array # uniq dengan satu blok:
Atau pendekatan yang lebih ringkas:
sumber
Rails juga memiliki a
#uniq_by
metode.Referensi: Parameterized Array # uniq (yaitu, uniq_by)
sumber
Saya suka jawaban jmah dan Head. Tapi apakah mereka mempertahankan urutan array? Mereka mungkin ada di versi ruby yang lebih baru karena ada beberapa persyaratan penyimpanan urutan penyisipan hash yang ditulis ke dalam spesifikasi bahasa, tetapi berikut adalah solusi serupa yang saya suka gunakan yang mempertahankan ketertiban.
sumber
Implementasi ActiveSupport:
sumber
Sekarang jika Anda dapat mengurutkan nilai atribut, ini dapat dilakukan:
Itu untuk 1-atribut unik, tetapi hal yang sama dapat dilakukan dengan pengurutan leksikografis ...
sumber