使用Array.reduce时出现奇怪的结果

3

我将使用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个回答

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是动态的,所以它会接受你给它的一切(不仅仅是你真正想要的两个参数)。

我不同意你的观点。如果我想定义reduce的初始值,应该这样写:[1,2,3].reduce(fn , init_val )请注意,在我的示例中,reduce函数始终只有一个参数,即函数...请看我的答案。 - abuduba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接