con*_*att 88 javascript underscore.js
我正在使用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);
});
Run Code Online (Sandbox Code Playgroud)
小智 161
索引实际上是可用的;
_.sortBy([1, 4, 2, 66, 444, 9], function(num, index){ });
Run Code Online (Sandbox Code Playgroud)
jab*_*lab 81
您可以通过向迭代器添加另一个参数来获取当前迭代的索引function,例如
_.each(['foo', 'bar', 'baz'], function (val, i) {
console.log(i + ": " + val); // 0: foo, 1: bar, 2: baz
});
Run Code Online (Sandbox Code Playgroud)
Mar*_*Dow 19
如果您更倾向于转换数组,那么iterator下划线map函数的参数也会作为第二个参数传递给索引.所以:
_.map([1, 4, 2, 66, 444, 9], function(value, index){ return index + ':' + value; });
Run Code Online (Sandbox Code Playgroud)
...返回:
["0:1", "1:4", "2:2", "3:66", "4:444", "5:9"]
Run Code Online (Sandbox Code Playgroud)
小智 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 .
Run Code Online (Sandbox Code Playgroud)
另一方面,如果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
Run Code Online (Sandbox Code Playgroud)
作为参考,这是来自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;
};
Run Code Online (Sandbox Code Playgroud)