lodash mehrspaltig sortBy absteigend


151

Es gibt eine raffinierte Methode, um ein Array von Objekten anhand mehrerer Eigenschaften zu sortieren:

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

Dies gilt jedoch nur für die aufsteigende Sortierung. Gibt es eine praktische Möglichkeit, die Richtung pro Spalte zu definieren? Z.B

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

Antworten:


328

Ab lodash 3.5.0 können Sie sortByOrder verwenden (in v4.3.0 in orderBy umbenannt):

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

Seit Version 3.10.0 können Sie sogar die Standardsemantik für die Bestellung verwenden (asc, desc):

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

In Version 4 von lodash wurde diese Methode in orderBy umbenannt :

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

7
Zu Ihrer Information, diese Funktion wurde ab 4.3.0 in Lodash in _.orderBy ( lodash.com/docs#orderBy ) umbenannt. Die normale Sortierfunktion heißt _.sortBy ( lodash.com/docs#sortBy )
Nidhin David

2
Ich bekomme die _.sortByOrder is not a functionneueste Version von lodash.
Chovy

65
Warum benennt lodash Funktionen immer wieder um?
Kenny Worden

13
Der , ['asc', 'desc']Teil wird für mich mit lodash@4.17.10 einfach ignoriert. Alles ist nur aufsteigend sortiert.
Maninak

4
@maninak Dies ist für _.sortBy. Versuchen Sie es _.orderBystattdessen. Hoffe das hilft.
pcasme

45

Sie können immer verwenden Array.prototype.reverse()

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

ha das ist klug Für eine aufsteigende numerische Sortierung (Lodash-Standardwerte absteigend) habe ich Folgendes verwendet: _.sortBy (Array_of_objects, "some_numerical_value_key"). reverse ()
devonj

2
Obwohl dies für einige Fälle gut genug ist, führt dies dazu, dass BEIDE Spalten absteigend sortiert werden, was in der Frage nicht gestellt wird.
Inkling

Bitte schlagen Sie eine Antwort vor? stackoverflow.com/questions/62611489/…
reacg garav

14

Es ist erwähnenswert, dass Sie, wenn Sie bestimmte Eigenschaften absteigend sortieren möchten, nicht einfach .reverse () am Ende anhängen möchten, da dadurch alle Sortierungen absteigend werden.

Um bestimmte Sortierungen absteigend zu machen, verketten Sie Ihre Sortierungen von niedrigstwertig bis höchstwertig und rufen Sie nach jeder Sortierung, die absteigend sein soll, .reverse () auf.

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

Da die Sortierung von _ eine stabile Sortierung ist, können Sie Sortierungen sicher verketten und umkehren. Wenn zwei Elemente für eine Eigenschaft denselben Wert haben, bleibt ihre Reihenfolge erhalten.

Mehr Informationen


Wenn Sie nicht genug Repräsentanten haben, um zu kommentieren, kommentieren Sie nicht. Sie haben dies zwar zu einer tatsächlichen Antwort ausgearbeitet, was gut ist, aber Sie müssen diese Tatsache nicht einmal erwähnen.
ArtOfCode

Bitte schlagen Sie eine Antwort vor? stackoverflow.com/questions/62611489/…
reacg garav


5

Gibt es eine praktische Möglichkeit, die Richtung pro Spalte zu definieren?

Nein. Sie können die Sortierreihenfolge nur durch eine Rückruffunktion angeben, die den Wert umkehrt. Nicht einmal dies ist für eine mehrspaltige Sortierung möglich.

Möglicherweise können Sie dies tun

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

Für alles andere müssen Sie .sort()mit einer benutzerdefinierten Vergleichsfunktion auf den Native zurückgreifen :

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

3

In der Dokumentation der Version 4.11.x heißt es: `" Diese Methode ähnelt _.sortBy, mit der Ausnahme, dass die Sortierreihenfolge der zu sortierenden Iteraten angegeben werden kann. Wenn die Reihenfolge nicht angegeben ist, werden alle Werte in aufsteigender Reihenfolge sortiert. Andernfalls Geben Sie eine Reihenfolge von "desc" für absteigend oder "asc" für aufsteigende Sortierreihenfolge der entsprechenden Werte an. " (Quelle https://lodash.com/docs/4.17.10#orderBy )

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


Ich denke du wolltest benutzen _.sortByOrder?
AJ Richardson

Variable _ kann nicht gefunden werden
Vishal Vaghasiya

Bitte schlagen Sie eine Antwort vor? stackoverflow.com/questions/62611489/…
reacg garav

0

Sie können dies auch versuchen:

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

Dies wird viel langsamer sein als nur mit _.orderBy
reggaeguitar
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.