Hier gibt es viele gute Antworten, aber ich möchte darauf hinweisen, dass sie sehr einfach erweitert werden können, um eine viel komplexere Sortierung zu erreichen. Das einzige, was Sie tun müssen, ist, den Operator OR zu verwenden, um Vergleichsfunktionen wie folgt zu verketten:
objs.sort((a,b)=> fn1(a,b) || fn2(a,b) || fn3(a,b) )
Wo fn1
,fn2
... sind die Sortierfunktionen der Rückkehr [-1,0,1]. Dies führt zu "Sortieren nach fn1", "Sortieren nach fn2", was in SQL ziemlich gleich ORDER BY ist.
Diese Lösung basiert auf dem Verhalten des ||
Operators, der den ersten ausgewerteten Ausdruck auswertet, der in true konvertiert werden kann .
Die einfachste Form hat nur eine Inline-Funktion wie diese:
// ORDER BY last_nom
objs.sort((a,b)=> a.last_nom.localeCompare(b.last_nom) )
Mit zwei Schritten mit last_nom
, first_nom
Sortierreihenfolge würde wie folgt aussehen:
// ORDER_BY last_nom, first_nom
objs.sort((a,b)=> a.last_nom.localeCompare(b.last_nom) ||
a.first_nom.localeCompare(b.first_nom) )
Eine generische Vergleichsfunktion könnte ungefähr so aussehen:
// ORDER BY <n>
let cmp = (a,b,n)=>a[n].localeCompare(b[n])
Diese Funktion kann erweitert werden, um numerische Felder, Groß- / Kleinschreibung, willkürliche Datentypen usw. zu unterstützen.
Sie können sie verwenden, um sie nach Sortierpriorität zu verketten:
// ORDER_BY last_nom, first_nom
objs.sort((a,b)=> cmp(a,b, "last_nom") || cmp(a,b, "first_nom") )
// ORDER_BY last_nom, first_nom DESC
objs.sort((a,b)=> cmp(a,b, "last_nom") || -cmp(a,b, "first_nom") )
// ORDER_BY last_nom DESC, first_nom DESC
objs.sort((a,b)=> -cmp(a,b, "last_nom") || -cmp(a,b, "first_nom") )
Der Punkt hier ist, dass reines JavaScript mit funktionalem Ansatz Sie ohne externe Bibliotheken oder komplexen Code weit bringen kann. Es ist auch sehr effektiv, da kein String-Parsing durchgeführt werden muss