lodash ordinamento multi-colonna In ordine decrescente


151

Esiste un metodo elegante per ordinare una matrice di oggetti in base a diverse proprietà:

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

Tuttavia, questo è solo per l'ordinamento crescente. Esiste un modo pratico per definire la direzione per colonna? Per esempio

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

Risposte:


330

A partire da lodash 3.5.0 è possibile utilizzare sortByOrder (rinominato orderBy in v4.3.0):

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

Dalla versione 3.10.0 puoi persino usare la semantica standard per ordinare (asc, desc):

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

Nella versione 4 di lodash questo metodo è stato rinominato orderBy :

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

7
Per vostra informazione, questa funzione è stata rinominata in _.orderBy ( lodash.com/docs#orderBy ) in Lodash dalla 4.3.0. La normale funzione di ordinamento si chiama _.sortBy ( lodash.com/docs#sortBy )
Nidhin David,

2
Sto entrando _.sortByOrder is not a functionnell'ultima versione di lodash.
Chovy

66
Perché lodash continua a rinominare le funzioni?
Kenny Worden,

13
La , ['asc', 'desc']parte viene semplicemente ignorata per me con lodash@4.17.10. Tutto è semplicemente ordinato in ordine crescente.
maninak,

4
@maninak Questo è per _.sortBy. Prova _.orderByinvece. Spero che questo ti aiuti.
pc

45

Puoi sempre usare Array.prototype.reverse()

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

questo è intelligente. per un ordinamento numerico crescente (valori predefiniti lodash decrescenti) Ho usato questo: _.sortBy (array_of_objects, "some_numerical_value_key"). reverse ()
devonj

3
Sebbene abbastanza buono per alcuni casi, l'effetto di questo è di ordinare in ordine decrescente su ENTRAMBE le colonne, il che non è quello che pone la domanda.
Inkling

Per favore, suggerisci una risposta? stackoverflow.com/questions/62611489/...
garav reacg

14

Vale la pena notare che se si desidera ordinare le proprietà particolari in ordine decrescente, non si desidera semplicemente aggiungere .reverse () alla fine, poiché ciò farà scendere tutti i tipi.

Per fare in modo che i tipi particolari scendano, concatenali dal meno significativo al più significativo, chiamando .reverse () dopo ogni ordinamento che desideri sia decrescente.

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

Poiché l'ordinamento di _ è un ordinamento stabile, è possibile eseguire in modo sicuro la catena e invertire gli ordinamenti perché se due elementi hanno lo stesso valore per una proprietà, il loro ordine viene conservato.

Maggiori informazioni


Se non hai abbastanza rappresentante per commentare, non commentare. Anche se l'hai trasformato in una vera risposta, il che è buono, ma non hai nemmeno bisogno di menzionarlo.
ArtOfCode

Per favore, suggerisci una risposta? stackoverflow.com/questions/62611489/...
garav reacg


5

Esiste un modo pratico per definire la direzione per colonna?

No. Non è possibile specificare il criterio di ordinamento se non tramite una funzione di callback che inverte il valore. Neanche questo è possibile per un ordinamento a più colonne.

Potresti essere in grado di fare

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

Per tutto il resto, dovrai ricorrere al nativo .sort()con una funzione di confronto personalizzata:

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

3

Nella documentazione della versione 4.11.x, dice: `` Questo metodo è simile a _.sortBy, tranne per il fatto che consente di specificare gli ordinamenti degli iterati da ordinare. Se gli ordini non sono specificati, tutti i valori sono ordinati in ordine crescente. , specifica un ordine di "desc" per decrescente o "asc" per l'ordinamento crescente di valori corrispondenti ". (fonte https://lodash.com/docs/4.17.10#orderBy )

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


Penso che volevi usare _.sortByOrder?
AJ Richardson,

impossibile trovare la variabile _
Vishal Vaghasiya il

Per favore, suggerisci una risposta? stackoverflow.com/questions/62611489/...
garav reacg

0

Puoi anche provare questo:

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

Questo sarà molto più lento del semplice utilizzo di _.orderBy
reggaeguitar il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.