Странный результат с использованием Array.reduce - PullRequest
3 голосов
/ 01 ноября 2011

Я пытаюсь объединить массив объектов JSON в один объект с помощью функции jQuery.extend. Предположим, у меня есть образец массива:

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 }

почему

Ответы [ 2 ]

3 голосов
/ 01 ноября 2011

Функция, переданная в reduce, получит четыре аргумента (последние два - это индекс текущего элемента и массив, для которого был вызван reduce). Вы интересуетесь только первыми двумя, но jQuery.extend принимает переменное количество аргументов, так что это все их убирает. Явно написав функцию, которая принимает два аргумента и передает их extend, вы избегаете этого и получаете ожидаемое поведение.

1 голос
/ 01 ноября 2011

Результат кажется странным только до тех пор, пока вы не увидите реализацию reduce, особенно этот оператор перед началом цикла:

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  
}  

Имеет смысл сейчас.И extend носит динамический характер, поэтому он будет принимать все, что вы ему дадите (не только два аргумента, которые вам действительно нужны).

...