Istnieje wiele dobrych odpowiedzi, ale chciałbym zauważyć, że można je bardzo łatwo rozszerzyć, aby uzyskać znacznie bardziej złożone sortowanie. Jedyne, co musisz zrobić, to użyć operatora OR do połączenia funkcji porównania w następujący sposób:
objs.sort((a,b)=> fn1(a,b) || fn2(a,b) || fn3(a,b) )
gdzie fn1
,fn2
... są zwracane funkcje sortowania [-1,0,1]. Powoduje to „sortowanie według fn1”, „sortowanie według fn2”, co jest prawie równe ORDER BY w SQL.
To rozwiązanie opiera się na zachowaniu ||
operatora, który ocenia pierwsze ocenione wyrażenie, które można przekonwertować na true .
Najprostsza forma ma tylko jedną wbudowaną funkcję:
// ORDER BY last_nom
objs.sort((a,b)=> a.last_nom.localeCompare(b.last_nom) )
Mając dwa kroki z last_nom
, first_nom
porządek będzie wyglądać następująco:
// ORDER_BY last_nom, first_nom
objs.sort((a,b)=> a.last_nom.localeCompare(b.last_nom) ||
a.first_nom.localeCompare(b.first_nom) )
Ogólna funkcja porównania może wyglądać mniej więcej tak:
// ORDER BY <n>
let cmp = (a,b,n)=>a[n].localeCompare(b[n])
Funkcję tę można rozszerzyć o obsługę pól numerycznych, rozróżnianie wielkości liter, arbitralne typy danych itp.
Możesz ich użyć do łączenia ich według priorytetów sortowania:
// 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") )
Chodzi o to, że czysty JavaScript z funkcjonalnym podejściem może zabrać cię daleko bez zewnętrznych bibliotek lub złożonego kodu. Jest również bardzo skuteczny, ponieważ nie trzeba wykonywać analizy ciągów