tri multi-colonnes lodash


151

Il existe une méthode astucieuse pour trier un tableau d'objets en fonction de plusieurs propriétés:

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

Cependant, ce n'est que pour le tri croissant. Existe-t-il un moyen pratique de définir la direction par colonne? Par exemple

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

Réponses:


330

Depuis lodash 3.5.0, vous pouvez utiliser sortByOrder (renommé orderBy dans la v4.3.0):

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

Depuis la version 3.10.0, vous pouvez même utiliser la sémantique standard pour le classement (asc, desc):

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

Dans la version 4 de lodash, cette méthode a été renommée orderBy :

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

7
Pour vous info, cette fonction a été renommée _.orderBy ( lodash.com/docs#orderBy ) dans Lodash à partir de la version 4.3.0. La fonction de tri normale est appelée _.sortBy ( lodash.com/docs#sortBy )
Nidhin David

2
Je reçois la _.sortByOrder is not a functiondernière version de lodash.
chovy

66
Pourquoi lodash continue-t-il de renommer les fonctions?
Kenny Worden

13
La , ['asc', 'desc']partie est simplement ignorée pour moi avec lodash@4.17.10. Tout est simplement trié par ordre croissant.
maninak

4
@maninak C'est pour _.sortBy. Essayez à la _.orderByplace. J'espère que cela t'aides.
pcasme

45

Vous pouvez toujours utiliser Array.prototype.reverse()

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

ha c'est intelligent. pour un tri numérique croissant (par défaut lodash décroissant) J'ai utilisé ceci: _.sortBy (array_of_objects, "some_numerical_value_key"). reverse ()
devonj

3
Bien que suffisant pour certains cas, cela a pour effet de trier par ordre décroissant sur les DEUX colonnes, ce qui n'est pas ce que la question demande.
Inkling

Veuillez suggérer une réponse? stackoverflow.com/questions/62611489/…
reacg garav

14

Il est intéressant de noter que si vous voulez trier des propriétés particulières par ordre décroissant, vous ne voulez pas simplement ajouter .reverse () à la fin, car cela rendra tous les types descendants.

Pour faire des tris particuliers décroissants, enchaînez vos tris du moins significatif au plus significatif, en appelant .reverse () après chaque tri que vous souhaitez décroissant.

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

Le tri de _ étant un tri stable, vous pouvez enchaîner et inverser les tris en toute sécurité, car si deux éléments ont la même valeur pour une propriété, leur ordre est conservé.

Plus d'information


Si vous n'avez pas assez de représentants pour commenter, ne commentez pas. Bien que vous ayez étoffé cela en une réponse réelle, ce qui est bien, mais vous n'avez même pas besoin de mentionner ce fait.
ArtOfCode

Veuillez suggérer une réponse? stackoverflow.com/questions/62611489/…
reacg garav


5

Existe-t-il un moyen pratique de définir la direction par colonne?

Non. Vous ne pouvez pas spécifier l'ordre de tri autrement que par une fonction de rappel qui inverse la valeur. Même cela n'est pas possible pour un tri à plusieurs colonnes.

Vous pourrez peut-être faire

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

Pour tout le reste, vous devrez recourir au natif .sort()avec une fonction de comparaison personnalisée:

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

3

Dans la documentation de la version 4.11.x, il est dit: `` Cette méthode ressemble à _.sortBy sauf qu'elle permet de spécifier les ordres de tri des itérés à trier. Si les commandes ne sont pas spécifiées, toutes les valeurs sont triées par ordre croissant. Sinon , spécifiez un ordre de "desc" pour décroissant ou "asc" pour l'ordre de tri croissant des valeurs correspondantes. " (source https://lodash.com/docs/4.17.10#orderBy )

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


Je pense que vous vouliez utiliser _.sortByOrder?
AJ Richardson

impossible de trouver la variable _
Vishal Vaghasiya

Veuillez suggérer une réponse? stackoverflow.com/questions/62611489/…
reacg garav

0

Vous pouvez également essayer ceci:

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

Cela va être beaucoup plus lent que d'utiliser simplement _.orderBy
reggaeguitar
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.