Est-il possible d'obtenir l'index que vous triez dans Underscore.js?

88

J'utilise la bibliothèque JS Underscore et en particulier les appels de bibliothèque _.eachet _.sortby. Je me demande s'il existe un moyen possible d'obtenir l'index de la valeur dans le délégué d'itérateur

_.sortBy([1, 4, 2, 66, 444, 9], function(num){ 
    /*It'd be great to have access to the index in here */
    return Math.sin(num); 
});
contactmatt
la source

Réponses:

163

L'index est en fait disponible comme;

_.sortBy([1, 4, 2, 66, 444, 9], function(num, index){  });
osoner
la source
Fonctionne également pour la carte de lodash
Csaba Toth
6
Malheureusement, cela ne fonctionne pas dans Lodash à sortBypartir de la version 4.17.4, ce qui est probablement plus utile à savoir dans ce scénario.
Jonathan Dumaine
81

Vous pouvez obtenir l'index de l'itération courante en ajoutant un autre paramètre à votre itérateur function, par exemple

_.each(['foo', 'bar', 'baz'], function (val, i) {
    console.log(i + ": " + val); // 0: foo, 1: bar, 2: baz
});
jabclab
la source
19

Si vous préférez transformer votre tableau, le iteratorparamètre de la mapfonction de soulignement est également passé à l'index comme deuxième argument. Alors:

_.map([1, 4, 2, 66, 444, 9], function(value, index){ return index + ':' + value; });

... Retour:

["0:1", "1:4", "2:2", "3:66", "4:444", "5:9"]
Martin Dow
la source
10

L'itérateur de _.eachest appelé avec 3 paramètres (element, index, list). Alors oui, pour _.eachvous, obtenez l'index.

Vous pouvez faire la même chose dans sortBy

Janith
la source
6

Je pense qu'il vaut la peine de mentionner comment le _.each () du Underscore fonctionne en interne. _.Each (list, iteratee) vérifie si la liste passée est un objet tableau ou un objet.

Dans le cas où la liste est un tableau, les arguments iteratee seront un élément de liste et un index comme dans l'exemple suivant:

var a = ['I', 'like', 'pancakes', 'a', 'lot', '.'];
_.each( a, function(v, k) { console.log( k + " " + v); });

0 I
1 like
2 pancakes
3 a
4 lot
5 .

D'un autre côté, si l'argument de la liste est un objet, l'itération prendra un élément de liste et une clé:

var o = {name: 'mike', lastname: 'doe', age: 21};
_.each( o, function(v, k) { console.log( k + " " + v); });

name mike
lastname doe
age 21

Pour référence, c'est le code _.each () de Underscore.js 1.8.3

_.each = _.forEach = function(obj, iteratee, context) {
   iteratee = optimizeCb(iteratee, context);
   var i, length;
   if (isArrayLike(obj)) {
      for (i = 0, length = obj.length; i < length; i++) {
         iteratee(obj[i], i, obj);
      }
   } else {
      var keys = _.keys(obj);
      for (i = 0, length = keys.length; i < length; i++) {
         iteratee(obj[keys[i]], keys[i], obj);
      }
   }
   return obj;
};
mszymulanski
la source
1

Plus généralement, dans la plupart des cas, les fonctions de soulignement qui prennent une liste et un argument comme deux premiers arguments, donnent accès à l'index de la liste en tant qu'avant-dernier argument de l'itérateur. Il s'agit d'une distinction importante en ce qui concerne les deux fonctions de soulignement, _.reduce et _.reduceRight, qui prennent 'memo' comme troisième argument - dans le cas de ces deux, l'index ne sera pas le deuxième argument, mais le troisième:

var destination = (function() {
    var fields = ['_333st', 'offroad', 'fbi'];
    return _.reduce(waybillInfo.destination.split(','), function(destination, segment, index) {
        destination[fields[index]] = segment;
        return destination;
    }, {});
})();

console.log(destination);            
/*
_333st: "NYARFTW  TX"
fbi: "FTWUP"
offroad: "UP"

The following is better of course but not demonstrate my point:
var destination = _.object(['_333st', 'offroad', 'fbi'], waybillInfo.destination.split(','));
*/

Donc , si vous vouliez vous pourriez obtenir l'index à l' aide underscore lui - même: _.last(_.initial(arguments)). Une exception possible (je n'ai pas essayé) est _.map, car il peut prendre un objet au lieu d'une liste: "Si list est un objet JavaScript, les arguments de l'itérateur seront (valeur, clé, liste)." - voir: http://underscorejs.org/#map

Dexygène
la source
0

Lorsqu'elles sont disponibles, je crois que la plupart des fonctions de tableau lodash afficheront l'itération. Mais le tri n'est pas vraiment une itération de la même manière: lorsque vous êtes sur le numéro 66, vous ne traitez pas le quatrième élément du tableau tant qu'il n'est pas terminé. Une fonction de tri personnalisée parcourra un tableau plusieurs fois, poussant les nombres adjacents vers l'avant ou vers l'arrière, jusqu'à ce que tout soit à sa place.

Sir_Mapsalot
la source