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'}]);
nhaa123
quelle

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']);
djskinner
quelle
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 [email protected] 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();
RomanMinkin
quelle
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

Tintenfisch
quelle
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
13

Deep Field & Multi Field & Bestellung in verschiedene Richtungen Lodash> 4

var sortedArray = _.orderBy(mixedArray,
                            ['foo','foo.bar','bar.foo.bar'],               
                            ['desc','asc','desc']);
Mesut Yiğit
quelle
Eigentlich wäre das jetzt die Antwort. sortBy gibt Ihnen keine Richtung, orderBy jedoch.
Pablo Palacios
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
         || …;
 });
Bergi
quelle
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'])

Alejandro Silva
quelle
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']));
Shubham Verma
quelle
Dies wird viel langsamer sein als nur mit _.orderBy
reggaeguitar