2011-11-01 33 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,您可以避免这种情况并获得您期望的行为。

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本质上是动态的,所以它会把你给它的所有东西(不只是你真正想要的两个参数)。

+0

我同意你的看法.. 你写的情况下,如果我想定义为减少的初始值: '[1,2,3]。降低(FN,init_val)' 注意,减少函数总是(在我的示例中)一个参数是函数...看看我的答案。 – abuduba