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'}]);
nhaa123
źródło

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']);
djskinner
źródło
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 [email protected]. 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();
RomanMinkin
źródło
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

mątwa
źródło
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
13

Zamawianie głębokich pól i wielu pól oraz różne kierunki Lodash> 4

var sortedArray = _.orderBy(mixedArray,
                            ['foo','foo.bar','bar.foo.bar'],               
                            ['desc','asc','desc']);
Mesut Yiğit
źródło
Właściwie to byłaby teraz odpowiedź. sortBy nie daje wskazówek, ale orderBy tak.
Pablo Palacios
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
         || …;
 });
Bergi
źródło
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'])

Alejandro Silva
źródło
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']));
Shubham Verma
źródło
To będzie dużo wolniejsze niż zwykłe używanie _.orderBy
reggaeguitar