저는 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);
});
답변
인덱스는 실제로 다음과 같이 사용할 수 있습니다.
_.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
});
답변
배열을 변환하려는 경우 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"]
답변
이터레이터는 _.each
3 개의 매개 변수로 호출됩니다 (element, index, list)
. 네, _.each
택시를 위해 색인을 얻으십시오.
sortBy에서 동일한 작업을 수행 할 수 있습니다.
답변
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 .
반면에 목록 인수가 객체 인 경우 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;
};
답변
보다 일반적으로, 대부분의 상황에서 목록과 인수를 처음 두 인수로 사용하는 밑줄 함수는 반복기에 대한 마지막 인수 다음으로 목록 인덱스에 대한 액세스를 제공합니다. 세 번째 인수로 ‘memo’를 사용하는 두 개의 밑줄 함수 인 _.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입니다. 목록 대신 객체를 사용할 수 있기 때문입니다. “목록이 자바 스크립트 객체이면 반복기의 인수는 (값, 키, 목록)이됩니다.” -참조 : http://underscorejs.org/#map
답변
가능한 경우 대부분의 lodash 배열 함수가 반복을 보여줄 것이라고 생각합니다. 그러나 정렬은 실제로 같은 방식으로 반복되지 않습니다. 66 번이되면 완료 될 때까지 배열의 네 번째 항목을 처리하지 않습니다. 사용자 지정 정렬 함수는 모든 항목이 적절한 위치에있을 때까지 배열을 여러 번 반복하여 인접한 숫자를 앞뒤로 이동합니다.
