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

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

seiche
la source
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
13

Commande de champ profond et multi-champ et direction différente Lodash> 4

var sortedArray = _.orderBy(mixedArray,
                            ['foo','foo.bar','bar.foo.bar'],               
                            ['desc','asc','desc']);
Mesut Yiğit
la source
En fait, ce serait la réponse maintenant. sortBy ne vous donne pas de direction, mais orderBy le fait.
Pablo Palacios
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
         || …;
 });
Bergi
la source
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'])

Alejandro Silva
la source
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']));
Shubham Verma
la source
Cela va être beaucoup plus lent que d'utiliser simplement _.orderBy
reggaeguitar