web-dev-qa-db-fra.com

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

J'utilise la bibliothèque JS nderscore et en particulier avec _.each et _.sortby appels de bibliothèque. Je me demande s'il est possible d'obtenir l'index de la valeur dans le délégué 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); 
});
87
contactmatt

Index est effectivement disponible comme;

_.sortBy([1, 4, 2, 66, 444, 9], function(num, index){  });
159
osoner

Vous pouvez obtenir l'index de l'itération en cours 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
});
81
jabclab

Si vous préférez transformer votre tableau, le paramètre iterator de la fonction map du trait de soulignement est également transmis à l'index en tant que second argument. Alors:

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

... résultats:

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

L'itérateur de _.each est appelé avec 3 paramètres (element, index, list). Alors oui, pour _.each vous pouvez obtenir l’index.

Vous pouvez faire la même chose en triBy

9
janith

Je pense que cela vaut la peine de mentionner le fonctionnement interne de _.each () de l’Undercore. Le _.each (list, iteratee) vérifie si la liste transmise est un objet de tableau ou un objet.

Dans le cas où la liste est un tableau, les arguments iteratee seront un élément de la 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'autre part, si l'argument de liste est un objet, l'itéré 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, il s'agit du 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;
};
5
mszymulanski

Plus généralement, dans la plupart des cas, les fonctions de soulignement qui prennent une liste et un argument comme les deux premiers arguments permettent d'accéder à l'index de liste en tant qu'avant-dernier argument de l'itérateur. C'est une distinction importante en ce qui concerne les deux fonctions de soulignement, _.reduce et _.reduceRight, qui prennent "mémo" comme troisième argument - dans ce cas, 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 le souhaitez, vous pouvez obtenir l'index en utilisant le trait de soulignement lui-même: _.last(_.initial(arguments)). Une exception possible (je n'ai pas essayé) est _.map, car elle 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

1
George Jempty

Lorsque disponible, je pense que la plupart des fonctions de tableau de lodash montreront l’itération. Mais le tri n'est pas vraiment une itération de la même manière: lorsque vous êtes sur le nombre 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 parcourt un tableau plusieurs fois, déplaçant les nombres adjacents en avant ou en arrière, jusqu'à ce que tout soit à sa place.

0
Sir_Mapsalot