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'}]);
À 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']);
Vous pouvez toujours utiliser Array.prototype.reverse()
var data = _.sortBy(array_of_objects, ['type', 'name']).reverse();
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é.
Champ profond & champ multiple & direction différente commande Lodash> 4
var sortedArray = _.orderBy(mixedArray,
['foo','foo.bar','bar.foo.bar'],
['desc','asc','desc']);
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
|| …;
});
Vous pouvez aussi essayer ceci:
var data= _.reverse(_.sortBy(res.locals.subscriptionList.items, ['type', 'name']));