89

我正在使用 JS 库下划线,特别是使用_.each_.sortby库调用。我想知道是否有任何可能的方法来获取迭代器委托中的值的索引

_.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); 
});
4

7 回答 7

165

索引实际上是可用的;

_.sortBy([1, 4, 2, 66, 444, 9], function(num, index){  });
于 2012-08-29T14:14:48.903 回答
82

您可以通过向迭代器添加另一个参数来获取当前迭代的索引function,例如

_.each(['foo', 'bar', 'baz'], function (val, i) {
    console.log(i + ": " + val); // 0: foo, 1: bar, 2: baz
});
于 2012-08-29T14:14:51.537 回答
19

如果你想转换你的数组,那么iterator下划线map函数的参数也会作为第二个参数传递索引。所以:

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

...返回:

["0:1", "1:4", "2:2", "3:66", "4:444", "5:9"]
于 2014-03-13T07:32:17.980 回答
10

的迭代器_.each使用 3 个参数调用(element, index, list)。所以是的,为_.each您获取索引。

你可以在 sortBy 中做同样的事情

于 2012-08-29T14:14:33.070 回答
6

我认为值得一提的是 Underscore 的 _.each() 是如何在内部工作的。_.each(list, iteratee) 检查传递的列表是数组对象还是对象。

如果列表是一个数组,迭代参数将是一个列表元素和索引,如下例所示:

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 .

另一方面,如果 list 参数是一个对象,则 iteratee 将采用一个列表元素和一个键:

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

name mike
lastname doe
age 21

作为参考,这是来自 Underscore.js 1.8.3 的 _.each() 代码

_.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;
};
于 2015-12-09T16:44:28.803 回答
1

更一般地,在大多数情况下,将列表和参数作为前两个参数的下划线函数提供对列表索引的访问,作为迭代器的倒数第二个参数。当涉及到两个下划线函数 _.reduce 和 _.reduceRight 时,这是一个重要的区别,它们将 'memo' 作为第三个参数——在这两个函数的情况下,索引不是第二个参数,而是第三:

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(','));
*/

因此,如果您愿意,可以使用下划线本身获取索引:_.last(_.initial(arguments)). 一个可能的例外(我没有尝试过)是 _.map,因为它可以使用对象而不是列表:“如果列表是 JavaScript 对象,迭代器的参数将是(值、键、列表)。” -- 见:http ://underscorejs.org/#map

于 2013-09-11T16:41:04.317 回答
0

如果可用,我相信大多数 lodash 数组函数都会显示迭代。但是排序并不是真正意义上的迭代:当你在数字 66 上时,你不会处理数组中的第四个项目,直到它完成。自定义排序函数将多次循环遍历数组,向前或向后轻推相邻的数字,直到所有内容都在适当的位置。

于 2019-03-05T21:28:04.253 回答