我正在使用JS库Underscore,特别是使用 _.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);
});
答案 0 :(得分:158)
索引实际上可以像;
_.sortBy([1, 4, 2, 66, 444, 9], function(num, index){ });
答案 1 :(得分:80)
您可以通过向迭代器function
添加另一个参数来获取当前迭代的索引,例如
_.each(['foo', 'bar', 'baz'], function (val, i) {
console.log(i + ": " + val); // 0: foo, 1: bar, 2: baz
});
答案 2 :(得分: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"]
答案 3 :(得分:9)
使用3个参数_.each
调用(element, index, list)
的迭代器。所以是的,对于_.each
,你可以获得索引。
你可以在sortBy
中做同样的事情答案 4 :(得分:5)
我认为值得一提的是Underscore的_.each()如何在内部运作。 _.each(list,iteratee)检查传递的列表是数组对象还是对象。
如果列表是一个数组,则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将获取一个list元素和一个键:
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;
};
答案 5 :(得分:1)
更一般地说,在大多数情况下,将list和argument作为前两个参数的下划线函数提供对列表索引的访问,作为迭代器的倒数第二个参数。当涉及两个下划线函数_.reduce和_.reduceRight时,这是一个重要的区别,它采用了备忘录&#39;作为他们的第三个参数 - 在这两个参数的情况下,索引不是第二个参数,而是第三个参数:
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,因为它可以取一个对象而不是一个列表:&#34;如果list是一个JavaScript对象,迭代器的参数将是(value, key,list)。&#34; - 见:http://underscorejs.org/#map
答案 6 :(得分:0)
当可用时,我相信大多数lodash数组函数都将显示迭代。但是排序实际上不是以相同的方式进行迭代:当数字为66时,直到完成为止,您才需要处理数组中的第四项。自定义排序功能将多次遍历数组,向前或向后轻推相邻的数字,直到所有内容都位于适当的位置为止。