Javascript 有没有可能得到你想要的索引';在下划线.js中重新排序?

Javascript 有没有可能得到你想要的索引';在下划线.js中重新排序?,javascript,underscore.js,Javascript,Underscore.js,我正在使用JS库,特别是使用和库调用。我想知道是否有任何可能的方法可以在迭代器委托中获取值的索引 _.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); }); 的迭代器。每个都用3个参数调用(元素、索引、列表)。因此,是的,对于\。每个都可以得到索引 您可以在sortBy中执行相同的

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

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

的迭代器。每个
都用3个参数调用
(元素、索引、列表)
。因此,是的,对于
\。每个
都可以得到索引


您可以在sortBy中执行相同的操作,索引实际上是可用的,如

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

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

_.each(['foo', 'bar', 'baz'], function (val, i) {
    console.log(i + ": " + val); // 0: foo, 1: bar, 2: baz
});

更一般地说,在大多数情况下,将列表和参数作为前两个参数的下划线函数提供对列表索引的访问,作为迭代器的下一个最后一个参数。这是两个下划线函数u.reduce和u.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(','));
*/

因此,如果需要,您可以使用下划线本身获取索引:
\uu.last(\uu.initial(arguments))
。一个可能的例外(我还没有尝试过)是u.map,因为它可以接受一个对象而不是一个列表:“如果列表是一个JavaScript对象,迭代器的参数将是(值、键、列表)。”--请参阅:

如果您想转换数组,然后下划线的
map
函数的
iterator
参数也作为第二个参数传递给索引。因此:

_.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"]

我认为值得一提的是下划线的u.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参数是一个对象,则迭代对象将获取一个list元素和一个键:

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

name mike
lastname doe
age 21
以下是下划线.js 1.8.3中的u2;.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;
};
\uEach=\uForEach=函数(对象、迭代对象、上下文){
iteratee=optimizeCb(iteratee,上下文);
变量i,长度;
if(类isArrayLike(obj)){
对于(i=0,长度=obj.length;i
如果可用,我相信大多数lodash数组函数都会显示迭代。但是排序并不是以同样的方式进行迭代:当你在66号上时,你不会处理数组中的第四项,直到它完成。自定义排序函数将在数组中循环多次,向前或向后轻推相邻的数字,直到所有内容都位于正确的位置。

也适用于lodash的地图。从4.17.4版开始,这实际上不适用于lodash的
sortBy
,在这种情况下,了解这一点可能更有帮助。