我正在尝试使用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 }
为什么?
答案 0 :(得分:3)
传递给reduce
的函数将接收四个参数(最后两个是当前项的索引和调用reduce
的数组)。你只对前两个感兴趣,但是jQuery.extend
采用了可变数量的参数,所以它会把它们全部搞砸。通过显式编写一个带有两个参数并将它们传递给extend
的函数,可以避免这种情况并获得预期的行为。
答案 1 :(得分:1)
结果似乎很奇怪,直到你看到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
本质上是动态的,所以它会把你给它的一切都带走(而不仅仅是你真正想要的两个参数)。