web-dev-qa-db-fra.com

Utiliser Javascript avec Underscore.js pour trier dans l'autre sens

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.

41
Harry

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(...)
34
Felix Loether

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()
79
h--n

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);
0
Fasani

É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');
};
0
Billy Moon