Можно ли получить индекс, который вы сортируете в подчеркивании.Джей?
Я использую библиотеку 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);
});
6 ответов:
Вы можете получить индекс текущей итерации, добавив еще один параметр в свой итератор
function
, например,_.each(['foo', 'bar', 'baz'], function (val, i) { console.log(i + ": " + val); // 0: foo, 1: bar, 2: baz });
итератор
_.each
вызывается с 3 параметрами(element, index, list)
. Так что да, для_.each
Вы такси получите индекс.вы можете сделать то же самое в sortBy
Я думаю, что стоит упомянуть, как подчеркивание _.каждый () работает внутренне. Этот._ каждый (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 .
С другой стороны, если аргумент списка является объектом, итератор будет принимать элемент списка и ключ:
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
_.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; };
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, поскольку он может принимать объект вместо списка: "если list является объектом JavaScript, аргументы итератора будут (значение, ключ, список).- смотрите:http://underscorejs.org/#map