Keine dieser Antworten ist ideal als Allzweckmethode für die Verwendung mehrerer Felder in einer Sortierung. Alle oben genannten Ansätze sind ineffizient, da sie entweder das Sortieren des Arrays mehrmals erfordern (was auf einer ausreichend großen Liste die Dinge erheblich verlangsamen kann) oder große Mengen an Müllobjekten generieren, die die VM bereinigen (und letztendlich verlangsamen muss) das Programm runter).
Hier ist eine Lösung, die schnell und effizient ist, eine einfache umgekehrte Sortierung ermöglicht und mit underscore
oder lodash
oder direkt mit verwendet werden kannArray.sort
Der wichtigste Teil ist die compositeComparator
Methode, die ein Array von Komparatorfunktionen verwendet und eine neue zusammengesetzte Komparatorfunktion zurückgibt.
/**
* 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);
});
}
Sie benötigen außerdem eine Komparatorfunktion, um die Felder zu vergleichen, nach denen Sie sortieren möchten. Die naturalSort
Funktion erstellt einen Komparator für ein bestimmtes Feld. Das Schreiben eines Komparators für die umgekehrte Sortierung ist ebenfalls trivial.
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;
}
}
(Der gesamte bisherige Code ist wiederverwendbar und kann beispielsweise im Dienstprogrammmodul gespeichert werden.)
Als Nächstes müssen Sie den zusammengesetzten Komparator erstellen. In unserem Beispiel würde es so aussehen:
var cmp = compositeComparator([naturalSort('roomNumber'), naturalSort('name')]);
Dies wird nach Raumnummer sortiert, gefolgt von Name. Das Hinzufügen zusätzlicher Sortierkriterien ist trivial und hat keinen Einfluss auf die Leistung der Sortierung.
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);
Gibt Folgendes zurück
[ { name: 'Chris', roomNumber: 1, bedNumber: 1 },
{ name: 'Lisa', roomNumber: 2, bedNumber: 2 },
{ name: 'Omar', roomNumber: 2, bedNumber: 1 },
{ name: 'John', roomNumber: 3, bedNumber: 1 } ]
Der Grund, warum ich diese Methode bevorzuge, ist, dass sie eine schnelle Sortierung nach einer beliebigen Anzahl von Feldern ermöglicht, nicht viel Müll erzeugt oder eine Zeichenfolgenverkettung innerhalb der Sortierung durchführt und einfach verwendet werden kann, sodass einige Spalten umgekehrt sortiert werden, während Auftragsspalten natürlich verwendet werden Sortieren.