使用Array.reduce的奇怪结果

时间:2011-11-01 19:02:27

标签: javascript jquery arrays json reduce

我正在尝试使用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 }

为什么?

2 个答案:

答案 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本质上是动态的,所以它会把你给它的一切都带走(而不仅仅是你真正想要的两个参数)。