Bu yanıtların hiçbiri, bir sıralamada birden çok alanı kullanmak için genel amaçlı bir yöntem olarak ideal değildir. Yukarıdaki yaklaşımların tümü, diziyi birden çok kez sıralamayı gerektirdiğinden (yeterince büyük bir listede işleri çok yavaşlatabilir) veya sanal makinenin temizlemesi gereken (ve nihayetinde yavaşlatan) büyük miktarlarda çöp nesneleri ürettikleri için verimsizdir. program aşağı).
Burada, hızlı, verimli bir çözüm kolayca bulunuyor ters sıralama izin verir ve kullanılabilir underscore
veya lodash
veya doğrudan ileArray.sort
En önemli kısım, compositeComparator
bir dizi karşılaştırıcı işlevi alan ve yeni bir bileşik karşılaştırma işlevi döndüren yöntemdir.
/**
* 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);
});
}
Ayrıca sıralamak istediğiniz alanları karşılaştırmak için bir karşılaştırma işlevine ihtiyacınız olacaktır. naturalSort
İşlev belli saha verilen bir karşılaştırıcı yaratacaktır. Ters sıralama için bir karşılaştırıcı yazmak da önemsizdir.
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;
}
}
(Şimdiye kadarki tüm kod yeniden kullanılabilir ve örneğin yardımcı program modülünde tutulabilir)
Ardından, bileşik karşılaştırıcı oluşturmanız gerekir. Örneğimiz için şöyle görünecektir:
var cmp = compositeComparator([naturalSort('roomNumber'), naturalSort('name')]);
Bu, oda numarasına ve ardından ada göre sıralanacaktır. Ek sıralama ölçütleri eklemek önemsizdir ve sıralamanın performansını etkilemez.
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);
Aşağıdakileri döndürür
[ { name: 'Chris', roomNumber: 1, bedNumber: 1 },
{ name: 'Lisa', roomNumber: 2, bedNumber: 2 },
{ name: 'Omar', roomNumber: 2, bedNumber: 1 },
{ name: 'John', roomNumber: 3, bedNumber: 1 } ]
Bu yöntemi tercih etmemin nedeni, rasgele sayıda alanda hızlı sıralamaya izin vermesi, çok fazla çöp üretmemesi veya sıralama içinde dize birleştirme gerçekleştirmemesi ve sıra sütunları doğal kullanırken bazı sütunların ters sıralanması için kolayca kullanılabilmesidir. çeşit.