lodash multi-kolom sortBy descending


151

Ada metode bagus untuk mengurutkan array objek berdasarkan beberapa properti:

var data = _.sortBy(array_of_objects, ['type', 'name']);

Namun itu hanya untuk penyortiran naik. Apakah ada cara yang mudah untuk menentukan arah per kolom? Misalnya

var data = _.sortBy(array_of_objects, [{'type': 'asc'}, {'name': 'desc'}]);

Jawaban:


330

Pada lodash 3.5.0 Anda dapat menggunakan sortByOrder (berganti nama menjadi orderBy di v4.3.0):

var data = _.sortByOrder(array_of_objects, ['type','name'], [true, false]);

Sejak versi 3.10.0 Anda bahkan dapat menggunakan semantik standar untuk memesan (asc, desc):

var data = _.sortByOrder(array_of_objects, ['type','name'], ['asc', 'desc']);

Dalam versi 4 dari lodash metode ini telah diubah namanya menjadi orderBy :

var data = _.orderBy(array_of_objects, ['type','name'], ['asc', 'desc']);

7
Untuk Anda info, fungsi ini telah diubah namanya menjadi _.orderBy ( lodash.com/docs#orderBy ) di Lodash pada 4.3.0. Fungsi pengurutan normal disebut _.sortBy ( lodash.com/docs#sortBy )
Nidhin David

2
Saya mendapatkan _.sortByOrder is not a functionversi terbaru dari Lodash.
chovy

66
Mengapa lodash terus mengganti nama fungsi?
Kenny Worden

13
Bagian , ['asc', 'desc']ini semakin diabaikan bagi saya dengan lodash@4.17.10. Semuanya hanya diurutkan naik.
maninak

4
@maninak Ini untuk _.sortBy. Coba _.orderBysaja. Semoga ini membantu.
pcasme

45

Anda selalu bisa menggunakan Array.prototype.reverse()

var data = _.sortBy(array_of_objects, ['type', 'name']).reverse();

ha itu pintar. untuk jenis numerik yang naik (lodash defaults turun) saya menggunakan ini: _.sortBy (array_of_objects, "some_numerical_value_key"). reverse ()
devonj

3
Meskipun cukup baik untuk beberapa kasus, efeknya adalah untuk mengurutkan turun pada KEDUA kolom, yang bukan pertanyaannya.
Inkling


14

Perlu dicatat bahwa jika Anda ingin mengurutkan properti tertentu turun, Anda tidak ingin hanya menambahkan .reverse () di akhir, karena ini akan membuat semua jenis turun.

Untuk membuat jenis tertentu menurun, rantai jenis Anda dari paling tidak signifikan ke yang paling signifikan, memanggil .reverse () setelah setiap jenis yang Anda ingin turun.

var data = _(data).chain()
    .sort("date")
    .reverse()    // sort by date descending
    .sort("name") // sort by name ascending
    .result()

Karena sortasi _ adalah sortir yang stabil, Anda dapat dengan aman memilah dan membalikkan sortir karena jika dua item memiliki nilai yang sama untuk sebuah properti, pesanannya dipertahankan.

Informasi lebih lanjut


Jika Anda tidak memiliki cukup perwakilan untuk berkomentar, jangan berkomentar. Meskipun Anda telah menyempurnakan ini menjadi jawaban yang sebenarnya, yang bagus, tetapi Anda bahkan tidak perlu menyebutkan fakta itu.
ArtOfCode



5

Apakah ada cara yang mudah untuk menentukan arah per kolom?

Tidak. Anda tidak dapat menentukan urutan pengurutan selain oleh fungsi panggilan balik yang membalikkan nilai. Bahkan ini tidak mungkin untuk jenis multicolumn.

Anda mungkin bisa melakukannya

 _.each(array_of_objects, function(o) {
     o.typeDesc = -o.type; // assuming a number
 });
 _.sortBy(array_of_objects, ['typeDesc', 'name'])

Untuk yang lainnya, Anda harus menggunakan yang asli .sort()dengan fungsi perbandingan khusus:

 array_of_objects.sort(function(a, b) {
     return a.type - b.type // asc
         || +(b.name>a.name)||-(a.name>b.name) // desc
         || …;
 });

3

Dalam dokumentasi versi 4.11.x, mengatakan: `" Metode ini seperti _.sortBy kecuali bahwa itu memungkinkan menentukan urutan pesanan dari iterate untuk mengurutkan berdasarkan. Jika pesanan tidak ditentukan, semua nilai diurutkan dalam urutan naik. , tentukan urutan "desc" untuk turun atau "asc" untuk urutan sortir dari nilai yang sesuai. " (sumber https://lodash.com/docs/4.17.10#orderBy )

let sorted = _.orderBy(this.items, ['fieldFoo', 'fieldBar'], ['asc', 'desc'])


Saya pikir Anda bermaksud menggunakannya _.sortByOrder?
AJ Richardson

tidak dapat menemukan variabel _
Vishal Vaghasiya


0

Anda juga dapat mencoba ini:

var data= _.reverse(_.sortBy(res.locals.subscriptionList.items, ['type', 'name']));

Ini akan menjadi cara yang lebih lambat daripada hanya menggunakan _.orderBy
reggaeguitar
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.