Dari pertanyaan awal ini , bagaimana saya menerapkan semacam pada beberapa bidang?
Menggunakan struktur yang sedikit disesuaikan ini, bagaimana saya mengurutkan kota (menaik) & lalu harga (turun)?
var homes = [
{"h_id":"3",
"city":"Dallas",
"state":"TX",
"zip":"75201",
"price":"162500"},
{"h_id":"4",
"city":"Bevery Hills",
"state":"CA",
"zip":"90210",
"price":"319250"},
{"h_id":"6",
"city":"Dallas",
"state":"TX",
"zip":"75000",
"price":"556699"},
{"h_id":"5",
"city":"New York",
"state":"NY",
"zip":"00010",
"price":"962500"}
];
Saya menyukai fakta daripada jawaban yang diberikan yang memberikan pendekatan umum. Di mana saya berencana untuk menggunakan kode ini, saya harus mengurutkan tanggal serta hal-hal lain. Kemampuan untuk "prima" objek tampak berguna, jika tidak sedikit rumit.
Saya sudah mencoba membangun jawaban ini menjadi contoh umum yang bagus, tetapi saya tidak memiliki banyak keberuntungan.
javascript
arrays
sorting
Mike
sumber
sumber
sort(["first-field", "ASC"], ["second-field", "DSC"]);
ini lebih rumit ketika saya mencoba menambahkan logika "primer" pada jawaban pertama sehingga saya dapat menangani tanggal, ketidakpekaan huruf, dll.Jawaban:
Metode penyortiran multi dimensi, berdasarkan jawaban ini :
Pembaruan : Ini adalah versi "yang dioptimalkan". Itu jauh lebih preprocessing dan membuat fungsi perbandingan untuk setiap opsi penyortiran sebelumnya. Mungkin perlu lebih banyak memori (karena menyimpan fungsi untuk setiap opsi penyortiran, tetapi harus melakukan preform sedikit lebih baik karena tidak harus menentukan pengaturan yang benar selama perbandingan. Saya belum melakukan profiling sekalipun.
Contoh penggunaan:
DEMO
Fungsi asli:
DEMO
sumber
untuk solusi non-generik, sederhana untuk masalah Anda:
sumber
if
pernyataan itu tidak masuk akal.a.localeCompare(b)
di baris terakhir untuk membandingkan string ... lihat dokumenif (a.city === b.city)
? Artinya, jika kedua kota itu sama maka bandingkan harganya, kalau tidak bandingkan kota-kota itu.Anda bisa menggunakan pendekatan penyortiran berantai dengan mengambil delta nilai hingga mencapai nilai yang tidak sama dengan nol.
Atau, menggunakan es6, cukup:
sumber
Berikut ini adalah pendekatan fungsional sederhana. Tentukan urutan pengurutan menggunakan larik. Prepend minus untuk menentukan urutan menurun.
Sunting: di ES6 bahkan lebih pendek!
sumber
[10,100,11,9]
. Apakah saya melewatkan sesuatu?Saya membuat penyortir multi fitur yang cukup umum hari ini. Anda dapat melihat thenBy.js di sini: https://github.com/Teun/thenBy.js
Ini memungkinkan Anda untuk menggunakan Array.sort standar, tetapi dengan gaya firstBy (). ThenBy (). ThenBy (). Ini adalah cara dan kompleksitas yang lebih sedikit daripada solusi yang diposting di atas.
sumber
Fungsi berikut akan memungkinkan Anda untuk mengurutkan array objek pada satu atau beberapa properti, baik naik (default) atau turun di setiap properti, dan memungkinkan Anda untuk memilih apakah akan melakukan perbandingan case sensitif atau tidak. Secara default, fungsi ini melakukan jenis huruf besar-kecil.
Argumen pertama harus berupa array yang berisi objek. Argumen selanjutnya harus berupa daftar string yang dipisah koma yang mereferensikan properti objek yang berbeda untuk disortir. Argumen terakhir (yang opsional) adalah boolean untuk memilih apakah akan melakukan jenis huruf sensitif atau tidak - gunakan
true
untuk jenis huruf sensitif.Fungsi akan mengurutkan setiap properti / kunci dalam urutan naik secara default. Jika Anda ingin kunci tertentu untuk semacam dalam urutan, maka sebagai gantinya lulus dalam sebuah array dalam format ini:
['property_name', true]
.Berikut adalah beberapa contoh penggunaan fungsi yang diikuti oleh penjelasan (di mana
homes
array berisi objek):objSort(homes, 'city')
-> urutkan berdasarkan kota (ascending, case in-sensitive)objSort(homes, ['city', true])
-> urutkan berdasarkan kota (turun, case-in sensitif)objSort(homes, 'city', true)
-> urutkan berdasarkan kota kemudian harga (naik, peka huruf besar kecil )objSort(homes, 'city', 'price')
-> urutkan berdasarkan kota kemudian harga (keduanya naik, tidak sensitif huruf)objSort(homes, 'city', ['price', true])
-> urutkan berdasarkan kota (menanjak) lalu harga (turun), tidak sensitif kasus)Dan tanpa basa-basi lagi, inilah fungsinya:
Dan inilah beberapa contoh data:
sumber
Ini adalah cheat yang lengkap, tetapi saya pikir itu menambah nilai untuk pertanyaan ini karena pada dasarnya fungsi library kalengan yang dapat Anda gunakan di luar kotak.
Jika kode Anda memiliki akses ke
lodash
atau pustaka Lodash yang kompatibel sepertiunderscore
maka Anda dapat menggunakan_.sortBy
metode ini. Cuplikan di bawah ini disalin langsung dari dokumentasi lodash .Hasil yang dikomentari dalam contoh-contoh tersebut terlihat seperti mengembalikan array array tetapi itu hanya menunjukkan urutan dan bukan hasil aktual yang merupakan array objek.
sumber
Berikut ini satu lagi yang mungkin lebih dekat dengan ide Anda untuk sintaksis
Demo: http://jsfiddle.net/Nq4dk/2/
Sunting: Hanya untuk bersenang-senang, inilah variasi yang hanya membutuhkan string mirip sql, jadi Anda bisa melakukannya
sortObjects(homes, "city, price desc")
sumber
Lebih sederhana:
sumber
Saya suka pendekatan SnowBurnt tetapi perlu tweak untuk menguji kesetaraan pada kota BUKAN perbedaan.
sumber
Berikut adalah jenis multidimensi generik, memungkinkan untuk membalikkan dan / atau memetakan pada setiap level.
Ditulis dalam naskah. Untuk Javascript, lihat JSFiddle ini
Kode
Contoh Penggunaan
Mengurutkan susunan orang berdasarkan nama belakang, lalu nama depan:
Urutkan kode bahasa dengan nama mereka , bukan kode bahasa mereka (lihat
map
), lalu dengan versi menurun (lihatreverse
).sumber
Cara dinamis untuk melakukannya dengan kunci GANDA:
Menggunakan:
sumber
Ini adalah versi generik dari solusi @ Snowburnt:
Ini didasarkan pada semacam rutin yang saya gunakan. Saya tidak menguji kode khusus ini sehingga mungkin ada kesalahan tetapi Anda mendapatkan idenya. Idenya adalah untuk mengurutkan berdasarkan bidang pertama yang menunjukkan perbedaan dan kemudian berhenti dan pergi ke catatan berikutnya. Jadi, jika Anda mengurutkan berdasarkan tiga bidang dan bidang pertama dalam perbandingan sudah cukup untuk menentukan urutan pengurutan dari dua rekaman yang diurutkan maka kembalikan hasil pengurutan itu dan pergi ke catatan berikutnya.
Saya mengujinya (sebenarnya dengan sedikit lebih rumit semacam logika) pada 5000 catatan dan itu melakukannya dalam sekejap mata. Jika Anda benar-benar memuat lebih dari 1000 catatan ke klien, Anda mungkin harus menggunakan pemilahan dan pemilahan sisi-sisi.
Kode ini tidak menangani sensitivitas huruf besar tetapi saya menyerahkannya kepada pembaca untuk menangani modifikasi sepele ini.
sumber
Inilah solusi saya berdasarkan idiom transformasi Schwartzian , semoga bermanfaat.
Berikut ini contoh cara menggunakannya:
sumber
Cara lain
sumber
Cara menggunakan (put - (minus) tandatangani sebelum bidang jika Anda ingin mengurutkan dalam bidang tertentu urutan menurun)
Menggunakan fungsi di atas, Anda dapat mengurutkan json array dengan beberapa bidang. Tidak perlu mengubah fungsi tubuh sama sekali
sumber
Adaptasi dari jawaban @chriskelly.
Sebagian besar jawaban mengabaikan bahwa harga tidak akan diurutkan dengan benar jika nilainya dalam sepuluh ribu dan lebih rendah atau lebih dari satu juta. Respondasinya adalah jenis JS abjad. Itu dijawab dengan cukup baik di sini, Mengapa JavaScript tidak bisa mengurutkan "5, 10, 1" dan di sini Cara mengurutkan array bilangan bulat dengan benar .
Pada akhirnya kita harus melakukan beberapa evaluasi jika bidang atau simpul yang kita sortir adalah angka. Saya tidak mengatakan bahwa menggunakan
parseInt()
dalam hal ini adalah jawaban yang benar, hasil yang diurutkan lebih penting.Biola untuk diuji
sumber
price
dalam contoh ini dalam format string. Jika Anda ingin itu berfungsi dengan baik dengan contoh saya gunakan peta untuk mengkonversi bidang Anda ingin format angka terlebih dahulu. yaituconst correctedHomes = homes.map(h => ({...h, price: +h.price}))
Wow, ada beberapa solusi kompleks di sini. Begitu rumit sehingga saya memutuskan untuk membuat sesuatu yang lebih sederhana tetapi juga cukup kuat. Ini dia;
Dan ini adalah contoh bagaimana Anda menggunakannya.
Ini pertama-tama akan mengurutkan berdasarkan prioritas atribut, kemudian oleh nilai atribut.
sumber
Berikut adalah cara yang dapat diperluas untuk mengurutkan berdasarkan beberapa bidang.
Catatan
a.localeCompare(b)
adalah universal didukung dan kembali -1,0,1 jikaa<b
,a==b
,a>b
masing-masing.||
di baris terakhir membericity
prioritas lebihprice
.-price_order
var date_order = new Date(left.date) - new Date(right.date);
berfungsi seperti angka karena matematika tanggal berubah menjadi milidetik sejak tahun 1970.return city_order || -price_order || date_order;
sumber
Saya pikir ini mungkin cara termudah untuk melakukannya.
https://coderwall.com/p/ebqhca/javascript-sort-by-two-fields
Ini sangat sederhana dan saya mencobanya dengan 3 pasangan nilai kunci yang berbeda dan bekerja dengan sangat baik.
Ini adalah contoh sederhana, lihat tautan untuk detail lebih lanjut
sumber
Ini milik saya untuk referensi Anda, dengan contoh:
sumber
Saya mencari sesuatu yang serupa dan berakhir dengan ini:
Pertama, kami memiliki satu atau beberapa fungsi penyortiran, selalu mengembalikan 0, 1 atau -1:
Anda dapat membuat lebih banyak fungsi untuk setiap properti lain yang ingin Anda urutkan.
Lalu saya memiliki fungsi yang menggabungkan fungsi penyortiran ini menjadi satu:
Ini dapat digunakan untuk menggabungkan fungsi penyortiran di atas dengan cara yang mudah dibaca:
Ketika fungsi sortir mengembalikan 0, fungsi sortasi selanjutnya akan dipanggil untuk sortasi lebih lanjut.
sumber
Hanya pilihan lain. Pertimbangkan untuk menggunakan fungsi utilitas berikut:
Contoh penggunaan (dalam kasus Anda):
Perlu dicatat bahwa fungsi ini dapat lebih digeneralisasi untuk dapat menggunakan properti bersarang seperti 'address.city' atau 'style.size.width' dll.
sumber
Ini adalah algoritma rekursif untuk mengurutkan berdasarkan beberapa bidang sambil memiliki kesempatan untuk memformat nilai sebelum perbandingan.
Jika a dan b sama, itu hanya akan mencoba bidang berikutnya sampai tidak ada yang tersedia.
sumber
sumber
Di sini 'AffiliateDueDate' dan 'Judul' adalah kolom, keduanya diurutkan dalam urutan menaik.
sumber
Menyortir pada dua bidang tanggal dan contoh bidang numerik:
http://jsfiddle.net/hcWgf/57/
sumber
Menggunakan:
Tampilkan cuplikan kode
sumber
Bagaimana dengan solusi sederhana ini:
Berdasarkan pertanyaan ini, susunan javascript sortir dengan beberapa bidang (angka)
sumber