我将使用jQuery.extend函数来合并JSON对象的数组。假设,我有一个示例数组:
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 }
为什么?
我将使用jQuery.extend函数来合并JSON对象的数组。假设,我有一个示例数组:
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 }
reduce
函数传入的函数会接收四个参数(最后两个是当前项的索引和调用reduce
的数组)。你只对前两个感兴趣,但是jQuery.extend
接受可变数量的参数,因此它会将所有参数都捆绑在一起。通过显式编写一个只接受两个参数并将它们传递给extend
的函数,您可以避免这种情况,并获得您期望的行为。
结果似乎很奇怪,直到你看到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
是动态的,所以它会接受你给它的一切(不仅仅是你真正想要的两个参数)。
[1,2,3].reduce(fn , init_val )
请注意,在我的示例中,reduce函数始终只有一个参数,即函数...请看我的答案。 - abuduba