2011-11-01 2 views
3

jQuery.extend 함수를 사용하여 하나의 객체에 JSON 객체의 배열을 병합하려고합니다. 경우Array.reduce를 사용하는 이상한 결과

arr = [{a:4},{b:5}]; 

: 제가 샘플 배열을 가정한다

arr.reduce($.extend ) 
//result { "1":{b:5}, a:4, b:5 } 

하지만

arr.reduce(function(a, b){ return $.extend(a,b) }); 
//is ok: { a:4, b:5 } 

이유

?

답변

3

reduce에 전달 된 함수는 네 개의 인수를받습니다. 마지막 두 개는 현재 항목의 인덱스이고 reduce이 호출 된 배열입니다. 당신은 처음 두 가지에만 관심이 있지만 jQuery.extend은 가변적 인 수의 인수를 취합니다. 그래서 그것들 모두를 버립니다. 명시 적으로 두 개의 인수를 취하여이를 extend에 전달하는 함수를 사용하면이를 피하고 예상 한 동작을 얻습니다.

if(arguments.length <= 1) { 
    curr = this[0]; // Increase i to start searching the secondly defined element in the array 
    i = 1; // start accumulating at the second element 
} 

지금 감각을 만든다 :

1

결과는 루프가 시작하기 전에, 특히이 문을 reduce 구현을 볼 때까지만 이상한 것 같다. 그리고 extend은 사실상 동적입니다. 그래서 여러분이 정말로 원하는 두 가지 인자뿐만 아니라 여러분이주는 모든 것을 취할 것입니다.

내가 당신과 함께 동의
+0

.. 내가 같은 감소의 초기 값 정의를 원한다면 당신은 사건에 대해 쓰고있어 다음 그 '[1,2,3] .reduce (FN, init_val)' 주 함수를 줄이면 함수가되는 인수가 항상 내 샘플에서옵니다. 내 대답을보십시오. – abuduba