是否有可能得到您在Underscore.jssorting的索引?
我正在使用JS库_.each
,特别是使用_.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); });
索引实际上是可用的;
_.sortBy([1, 4, 2, 66, 444, 9], function(num, index){ });
你可以通过向迭代器function
添加另一个参数来得到当前迭代的索引
_.each(['foo', 'bar', 'baz'], function (val, i) { console.log(i + ": " + val); // 0: foo, 1: bar, 2: baz });
如果你想转换数组,那么下划线的map
函数的iterator
参数也会作为第二个parameter passing给索引。 所以:
_.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"]
_.each
的迭代器被调用3个参数(element, index, list)
。 所以,是的,因为你可以得到索引。
你可以在sortBy中做同样的事情
我认为值得一提的是下划线的_.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参数是一个对象,那么迭代器将获得一个列表元素和一个关键字:
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; };
更一般地说,在大多数情况下,下划线函数将列表和参数作为前两个参数,提供对列表索引的访问,作为迭代器的最后一个参数的下一个参数。 这是一个重要的区别,当涉及到两个下划线函数,_.reduce和_.reduceRight,以“备忘录”作为他们的第三个参数 – 在这两个索引的情况下,不会是第二个参数,但第三:
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))
。 一个可能的exception(我没有尝试过)是_.map,因为它可以采用一个对象而不是一个列表:“如果list是一个JavaScript对象,那么迭代器的参数将是(value,key,list)。 – 见: http : //underscorejs.org/#map