在第一次迭代之后,您将返回一个数字,然后尝试获取它的属性以添加到下一个对象,该对象和数学涉及的结果。x
undefined
undefined
NaN
尝试返回一个包含属性的对象,该属性的 x 属性之和为参数:x
var arr = [{x:1},{x:2},{x:4}];
arr.reduce(function (a, b) {
return {x: a.x + b.x}; // returns object with property x
})
// ES6
arr.reduce((a, b) => ({x: a.x + b.x}));
// -> {x: 7}
从评论中添加的解释:
每次迭代的返回值在下一次迭代中用作变量。[].reduce
a
迭代 1:、 、在迭代 2 中分配给a = {x:1}
b = {x:2}
{x: 3}
a
迭代 2:、 .a = {x:3}
b = {x:4}
您的示例的问题在于您返回的是一个数字文本。
function (a, b) {
return a.x + b.x; // returns number literal
}
迭代 1:、,与下一次迭代相同a = {x:1}
b = {x:2}
// returns 3
a
迭代 2:,返回a = 3
b = {x:2}
NaN
数字文本(通常)没有一个称为的属性,因此它是和返回的,并且总是3
x
undefined
undefined + b.x
NaN
NaN + <anything>
NaN
澄清:我更喜欢我的方法而不是这个线程中的其他顶部答案,因为我不同意传递一个可选参数来减少一个幻数来取出一个数字基元的想法。它可能会导致更少的行,但imo它的可读性较差。