Underscore.js에서 정렬중인 색인을 가져올 수 있습니까?


88

저는 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); 
});

답변:


163

인덱스는 실제로 다음과 같이 사용할 수 있습니다.

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

또한 lodash의지도를 위해 작동
사바 토스

6
슬프게도 이것은 버전 4.17.4부터 Lodash에서 실제로 작동하지 않으며sortBy ,이 시나리오에서 아는 것이 더 도움이 될 것입니다.
Jonathan Dumaine

81

당신은 당신의 반복자에 다른 매개 변수를 추가하여 현재 반복의 인덱스를 얻을 수 있습니다 function, 예를 들어,

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

19

배열을 변환하려는 경우 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"]

10

이터레이터는 _.each3 개의 매개 변수로 호출됩니다 (element, index, list). 네, _.each택시를 위해 색인을 얻으십시오.

sortBy에서 동일한 작업을 수행 할 수 있습니다.


6

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;
};

1

보다 일반적으로, 대부분의 상황에서 목록과 인수를 처음 두 인수로 사용하는 밑줄 함수는 반복기에 대한 마지막 인수 다음으로 목록 인덱스에 대한 액세스를 제공합니다. 세 번째 인수로 '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


0

가능한 경우 대부분의 lodash 배열 함수가 반복을 보여줄 것이라고 생각합니다. 그러나 정렬은 실제로 같은 방식으로 반복되지 않습니다. 66 번이되면 완료 될 때까지 배열의 네 번째 항목을 처리하지 않습니다. 사용자 지정 정렬 함수는 모든 항목이 적절한 위치에있을 때까지 배열을 여러 번 반복하여 인접한 숫자를 앞뒤로 이동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.