J'utilise Javascript sort
(avec Underscore.js):
_.sortBy(["Bob", "Mary", "Alice"], function (name) {return name})
> ["Alice", "Bob", "Mary"]
Je voudrais que le tableau revienne dans l'autre sens. Comment je fais ça?
["Mary", "Bob", "Alice"]
Je ne veux pas l'inverser après qu'il soit trié - je veux qu'il soit créé dans l'autre sens la première fois.
Merci.
Je ferais juste ce que Underscore fait sous le capot: utilisez la méthode Array # sort .
["Bob", "Mary", "Alice"].sort(function (a, b) {
if (a < b) return 1;
if (b < a) return -1;
return 0;
});
Ou si vous ne voulez pas que le tableau d'origine soit modifié, clonez-le d'abord:
_.clone(["Bob", "Mary", "Alice"]).sort(...)
Au lieu de jeter les traits de soulignement, je préfère l'utiliser avec Array.reverse
pour utiliser le meilleur des deux.
_.sortBy(["Bob", "Mary", "Alice"], function (name) {return name})
.reverse()
Vous pouvez le faire avec une doublure en ES6, changez simplement le >
Selon la direction que vous voulez.
.sort()
est supporté depuis IE6 et vous passez juste une fonction qui retourne 1 ou -1;
["Bob", "Mary", "Alice].sort((a, b) => a > b ? 1 : -1);
Évidemment, vous ne devriez pas faire cela, car il est beaucoup plus logique de trier, puis d'inverser les résultats, mais si vous voulez vraiment trier dans l'ordre inverse à l'intérieur de la fonction de tri, vous pouvez faire quelque chose comme ça ...
_.sortBy(["Bob", "Mary", "Alice"], function (a) {
// split each string into single characters
// ... then swap for inverse character from unicode range
// ... and glue the characters back together into an inversely sortable string
return _.map(a.split(''), function(i){
return String.fromCharCode(65536 - i.charCodeAt(0));
}).join('');
});
... il convient également de noter que le soulignement est subtilement différent du tri natif javascript qui présente un petit problème multiplateforme concernant l'ordre de tri cohérent ...
Si compareFunction (a, b) renvoie 0, laissez a et b inchangés l'un par rapport à l'autre, mais triés par rapport à tous les différents éléments. Remarque: la norme ECMAscript ne garantit pas ce comportement, et donc tous les navigateurs (par exemple, les versions de Mozilla datant d'au moins 2003) le respectent. Array.prototype.sort ()
.sortBy
la documentation indique:
Renvoie une copie triée (de manière stable) de la liste. _. sortBy
Ce qu'il fait au lieu de retourner 0
pour garder les éléments en ordre, il renvoie l'index du côté gauche moins l'index du côté droit.
_.sortBy = function(obj, iteratee, context) {
iteratee = cb(iteratee, context);
return _.pluck(_.map(obj, function(value, index, list) {
return {
value: value,
index: index,
criteria: iteratee(value, index, list)
};
}).sort(function(left, right) {
var a = left.criteria;
var b = right.criteria;
if (a !== b) {
if (a > b || a === void 0) return 1;
if (a < b || b === void 0) return -1;
}
return left.index - right.index;
}), 'value');
};