web-dev-qa-db-fra.com

lodash multi-colonne, triéPar décroissant

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 une direction par colonne? Par exemple.

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

À partir de lodash 3.5.0, vous pouvez utiliser sortByOrder (renommé orderBy en v4.3.0):

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

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

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

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

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

Vous pouvez toujours utiliser Array.prototype.reverse()

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

Il est à noter que si vous souhaitez trier des propriétés particulières par ordre décroissant, vous ne souhaitez pas simplement ajouter .reverse () à la fin, car toutes les tris seront décroissants.

Pour rendre des tris particuliers en ordre décroissant, enchaînez vos tris du moins significatif au plus significatif, appelez .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()

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

Plus d'information

13
cttlfsh

Champ profond & champ multiple & direction différente commande Lodash> 4 

var sortedArray = _.orderBy(mixedArray,
                            ['foo','foo.bar','bar.foo.bar'],               
                            ['desc','asc','desc']);
7
Mesut Yiğit

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

Non. Vous ne pouvez pas spécifier l'ordre de tri autrement que par une fonction de rappel inversant la valeur. Ce n'est même pas possible pour un tri multicolonne.

Vous pourriez être capable de 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 à la .sort() native 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
         || …;
 });
5
Bergi

Vous pouvez aussi essayer ceci:

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