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'}]);
nhaa123
sumber

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']);
djskinner
sumber
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 [email protected]. 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();
RomanMinkin
sumber
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
Tolong sarankan jawaban? stackoverflow.com/questions/62611489/…
reacg garav
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

sotong
sumber
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
Tolong sarankan jawaban? stackoverflow.com/questions/62611489/…
reacg garav
13

Bidang dalam & multi bidang & berbagai arah pemesanan Lodash> 4

var sortedArray = _.orderBy(mixedArray,
                            ['foo','foo.bar','bar.foo.bar'],               
                            ['desc','asc','desc']);
Mesut Yiğit
sumber
Sebenarnya ini akan menjadi jawabannya sekarang. sortBy tidak memberi Anda arahan, tetapi orderBy tidak.
Pablo Palacios
Tolong sarankan jawaban? stackoverflow.com/questions/62611489/…
reacg garav
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
         || …;
 });
Bergi
sumber
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'])

Alejandro Silva
sumber
Saya pikir Anda bermaksud menggunakannya _.sortByOrder?
AJ Richardson
tidak dapat menemukan variabel _
Vishal Vaghasiya
Tolong sarankan jawaban? stackoverflow.com/questions/62611489/…
reacg garav
0

Anda juga dapat mencoba ini:

var data= _.reverse(_.sortBy(res.locals.subscriptionList.items, ['type', 'name']));
Shubham Verma
sumber
Ini akan menjadi cara yang lebih lambat daripada hanya menggunakan _.orderBy
reggaeguitar