是否有可能让你在Underscore.js排序在指数?(Is it possible to get

2019-07-31 06:28发布

我使用的是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); 
});

Answer 1:

指数是实际可用等;

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


Answer 2:

您可以通过添加另一个参数,你的迭代得到当前迭代的索引function ,如

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


Answer 3:

如果您愿意转变您的数组,然后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"]


Answer 4:

的迭代_.each被称为与3个参数(element, index, list) 。 所以,是的,对于_.each你一辆出租车的指标。

你可以做sortBy相同



Answer 5:

我认为这是值得一提下划线的_.each()的内部工作原理。 所述_.each(列表,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 .

在另一方面,如果列表参数是一个对象的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;
};


Answer 6:

更一般地,在大多数情况下,强调的是采取列表和论证作为前两个参数的函数,提供访问列表索引的倒数第二个参数的迭代器。 这是一个重要的区别,当涉及到两个下划线功能,_.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)) 一个可能的例外(我没试过)是_.map,因为它可以利用,而不是一个列表的对象:“如果名单是一个JavaScript对象,迭代器的参数会(值,键列表)。” -见: http://underscorejs.org/#map



Answer 7:

空闲时,我相信大多数lodash阵列功能将显示迭代。 但排序是不是真的以同样的方式迭代:当你在66号,直到它完成,你不处理数组中的第四个项目。 通过阵列的定制排序函数将循环的次数,轻推相邻数字向前或向后,直到一切都在其适当的位置。



文章来源: Is it possible to get the index you're sorting over in Underscore.js?