lodash sortowanie wielokolumnowe Według malejącej


151

Istnieje sprytna metoda sortowania tablicy obiektów na podstawie kilku właściwości:

var data = _.sortBy(array_of_objects, ['type', 'name']);

Jednak dotyczy to tylko sortowania rosnącego. Czy jest jakiś wygodny sposób definiowania kierunku dla każdej kolumny? Na przykład

var data = _.sortBy(array_of_objects, [{'type': 'asc'}, {'name': 'desc'}]);

Odpowiedzi:


329

Od lodash 3.5.0 możesz użyć sortByOrder (zmieniono nazwę orderBy w wersji 4.3.0):

var data = _.sortByOrder(array_of_objects, ['type','name'], [true, false]);

Od wersji 3.10.0 możesz nawet używać standardowej semantyki do porządkowania (rosnąco, desc):

var data = _.sortByOrder(array_of_objects, ['type','name'], ['asc', 'desc']);

W wersji 4 lodash zmieniono nazwę tej metody na orderBy :

var data = _.orderBy(array_of_objects, ['type','name'], ['asc', 'desc']);

7
Dla Ciebie, ta funkcja została zmieniona na _.orderBy ( lodash.com/docs#orderBy ) w Lodash od 4.3.0. Normalna funkcja sortowania nazywa się _.sortBy ( lodash.com/docs#sortBy )
Nidhin David

2
Otrzymuję _.sortByOrder is not a functionnajnowszą wersję lodash.
chovy

66
Dlaczego lodash zmienia nazwy funkcji?
Kenny Worden

13
Ta , ['asc', 'desc']część jest dla mnie ignorowana z lodash@4.17.10. Wszystko jest po prostu posortowane rosnąco.
maninak

4
@maninak To jest dla _.sortBy. Spróbuj _.orderByzamiast tego. Mam nadzieję że to pomoże.
pcasme

45

Zawsze możesz użyć Array.prototype.reverse()

var data = _.sortBy(array_of_objects, ['type', 'name']).reverse();

ha to sprytne. dla sortowania numerycznego rosnąco (domyślnie lodash malejąco) Użyłem tego: _.sortBy (array_of_objects, "some_numerical_value_key"). reverse ()
devonj

3
Chociaż w niektórych przypadkach jest to wystarczające, efektem tego jest sortowanie malejąco w OBU kolumnach, co nie jest tym, o co chodzi w pytaniu.
Inkling

Proszę zasugerować odpowiedź? stackoverflow.com/questions/62611489/ ...
reacg garav

14

Warto zauważyć, że jeśli chcesz posortować poszczególne właściwości malejąco, nie chcesz po prostu dodawać na końcu .reverse (), ponieważ spowoduje to, że wszystkie rodzaje będą malejące.

Aby poszczególne sortowania były malejące, połącz je w łańcuch od najmniej znaczących do najbardziej znaczących, wywołując .reverse () po każdym sortowaniu, które chcesz malejąco.

var data = _(data).chain()
    .sort("date")
    .reverse()    // sort by date descending
    .sort("name") // sort by name ascending
    .result()

Ponieważ sortowanie _ jest sortowaniem stabilnym, można bezpiecznie łączyć i odwracać sortowanie, ponieważ jeśli dwa elementy mają tę samą wartość właściwości, ich kolejność jest zachowywana.

Więcej informacji


Jeśli nie masz wystarczającej liczby przedstawicieli, aby komentować, nie komentuj. Chociaż przerobiłeś to na rzeczywistą odpowiedź, co jest dobre, ale nawet nie musisz o tym wspominać.
ArtOfCode

Proszę zasugerować odpowiedź? stackoverflow.com/questions/62611489/ ...
reacg garav


5

Czy jest jakiś wygodny sposób definiowania kierunku dla każdej kolumny?

Nie. Porządek sortowania nie można określić inaczej niż za pomocą funkcji zwrotnej, która odwraca wartość. Nawet to nie jest możliwe w przypadku sortowania wielokolumnowego.

Możesz to zrobić

 _.each(array_of_objects, function(o) {
     o.typeDesc = -o.type; // assuming a number
 });
 _.sortBy(array_of_objects, ['typeDesc', 'name'])

W pozostałych przypadkach musisz skorzystać z natywnej funkcji .sort()z niestandardową funkcją porównania:

 array_of_objects.sort(function(a, b) {
     return a.type - b.type // asc
         || +(b.name>a.name)||-(a.name>b.name) // desc
         || …;
 });

3

W dokumentacji wersji 4.11.x jest napisane: `` Ta metoda jest podobna do _.sortBy, z tą różnicą, że pozwala określić porządek sortowania iteracji według kolejności sortowania. Jeśli zamówienia nie są określone, wszystkie wartości są sortowane w kolejności rosnącej. W przeciwnym razie określ kolejność „malejąco” malejąco lub „rosnąco” rosnącej kolejności sortowania odpowiednich wartości. ” (źródło https://lodash.com/docs/4.17.10#orderBy )

let sorted = _.orderBy(this.items, ['fieldFoo', 'fieldBar'], ['asc', 'desc'])


Myślę, że chciałeś użyć _.sortByOrder?
AJ Richardson

nie można znaleźć zmiennej _
Vishal Vaghasiya,

Proszę zasugerować odpowiedź? stackoverflow.com/questions/62611489/ ...
reacg garav

0

Możesz także spróbować tego:

var data= _.reverse(_.sortBy(res.locals.subscriptionList.items, ['type', 'name']));

To będzie dużo wolniejsze niż zwykłe używanie _.orderBy
reggaeguitar
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.