Tak satu pun dari jawaban ini yang ideal sebagai metode tujuan umum untuk menggunakan beberapa bidang dalam satu urutan. Semua pendekatan di atas tidak efisien karena memerlukan pengurutan beberapa kali (yang, pada daftar yang cukup besar dapat memperlambat banyak hal) atau menghasilkan sejumlah besar objek sampah yang perlu dibersihkan oleh VM (dan pada akhirnya memperlambat program down).
Berikut adalah solusi yang cepat, efisien, dengan mudah memungkinkan pengurutan terbalik, dan dapat digunakan dengan underscore
atau lodash
, atau langsung denganArray.sort
Bagian terpenting adalah compositeComparator
metode, yang mengambil larik fungsi pembanding dan mengembalikan fungsi komparator komposit baru.
/**
* Chains a comparator function to another comparator
* and returns the result of the first comparator, unless
* the first comparator returns 0, in which case the
* result of the second comparator is used.
*/
function makeChainedComparator(first, next) {
return function(a, b) {
var result = first(a, b);
if (result !== 0) return result;
return next(a, b);
}
}
/**
* Given an array of comparators, returns a new comparator with
* descending priority such that
* the next comparator will only be used if the precending on returned
* 0 (ie, found the two objects to be equal)
*
* Allows multiple sorts to be used simply. For example,
* sort by column a, then sort by column b, then sort by column c
*/
function compositeComparator(comparators) {
return comparators.reduceRight(function(memo, comparator) {
return makeChainedComparator(comparator, memo);
});
}
Anda juga memerlukan fungsi pembanding untuk membandingkan bidang yang ingin Anda sortir. The naturalSort
fungsi akan membuat pembanding diberi bidang tertentu. Menulis pembanding untuk pengurutan terbalik juga sepele.
function naturalSort(field) {
return function(a, b) {
var c1 = a[field];
var c2 = b[field];
if (c1 > c2) return 1;
if (c1 < c2) return -1;
return 0;
}
}
(Semua kode sejauh ini dapat digunakan kembali dan dapat disimpan dalam modul utilitas, misalnya)
Selanjutnya, Anda perlu membuat komparator komposit. Untuk contoh kita, akan terlihat seperti ini:
var cmp = compositeComparator([naturalSort('roomNumber'), naturalSort('name')]);
Ini akan mengurutkan berdasarkan nomor kamar, diikuti dengan nama. Menambahkan kriteria pengurutan tambahan itu mudah dan tidak memengaruhi kinerja pengurutan.
var patients = [
{name: 'John', roomNumber: 3, bedNumber: 1},
{name: 'Omar', roomNumber: 2, bedNumber: 1},
{name: 'Lisa', roomNumber: 2, bedNumber: 2},
{name: 'Chris', roomNumber: 1, bedNumber: 1},
];
// Sort using the composite
patients.sort(cmp);
console.log(patients);
Mengembalikan yang berikut
[ { name: 'Chris', roomNumber: 1, bedNumber: 1 },
{ name: 'Lisa', roomNumber: 2, bedNumber: 2 },
{ name: 'Omar', roomNumber: 2, bedNumber: 1 },
{ name: 'John', roomNumber: 3, bedNumber: 1 } ]
Alasan saya lebih suka metode ini adalah karena metode ini memungkinkan pengurutan cepat pada jumlah bidang yang berubah-ubah, tidak menghasilkan banyak sampah atau melakukan penggabungan string di dalam pengurutan dan dapat dengan mudah digunakan sehingga beberapa kolom diurutkan terbalik sementara kolom urutan menggunakan alami menyortir.