Javascript 还原返回为NaN的对象数组中的字段之和

Javascript 还原返回为NaN的对象数组中的字段之和,javascript,reduce,Javascript,Reduce,我看到javascript中的reduce函数有一种奇怪的行为 我有一个对象数组,如下所示: [ { a:1 }, {a:2}, ... ] const array = [{a:1}]; const reducer = (accumulator, currentValue) => accumulator.a + currentValue.a; console.log(array.reduce(reducer, {a: 0})); 我需要每个对象中a属性的总和,所以我写了以下内容: co

我看到javascript中的
reduce
函数有一种奇怪的行为

我有一个对象数组,如下所示:

[ { a:1 }, {a:2}, ... ]
const array = [{a:1}];
const reducer = (accumulator, currentValue) => accumulator.a + currentValue.a;
console.log(array.reduce(reducer, {a: 0}));
我需要每个对象中
a
属性的总和,所以我写了以下内容:

const array = [{a:1}, {a:2}];
const reducer = (accumulator, currentValue) => accumulator.a + currentValue.a;
console.log(array.reduce(reducer));
这正如预期的那样有效

如果我尝试使用包含单个对象的数组运行相同的代码,我会得到该对象作为
reduce
调用的结果(这是预期的行为),因此我向reduce函数调用添加了一个默认值,如下所示:

[ { a:1 }, {a:2}, ... ]
const array = [{a:1}];
const reducer = (accumulator, currentValue) => accumulator.a + currentValue.a;
console.log(array.reduce(reducer, {a: 0}));
这也是一种魅力

我希望能够使用包含多个元素的数组运行第二版本的reduce调用,例如:

const array = [{a:1}, {a:2}];
const reducer = (accumulator, currentValue) => accumulator.a + currentValue.a;
console.log(array.reduce(reducer, {a: 0}));
但这会返回
NaN
,我不明白为什么。 有人能解释一下吗?

使用时,如果不声明初始值,数组的第一项将成为初始值。由于您需要一个数字,而不是一个对象作为结果,因此请使用0初始化。由于累加器现在是一个数字,而不是一个对象,请使用
累加器
而不是
累加器。函数体中的a

const数组=[{a:1},{a:2},{a:3}];
const reducer=(累加器,currentValue)=>累加器+currentValue.a;
log(array.reduce(reducer,0))使用时,如果未声明初始值,则数组的第一项将成为初始值。由于您需要一个数字,而不是一个对象作为结果,因此请使用0初始化。由于累加器现在是一个数字,而不是一个对象,请使用
累加器
而不是
累加器。函数体中的a

const数组=[{a:1},{a:2},{a:3}];
const reducer=(累加器,currentValue)=>累加器+currentValue.a;

log(array.reduce(reducer,0))当您的
累加器
是一个对象时,您的
减速机
返回一个数值(累加器.a+当前值.a的总和)

初始化
累加器
0
或返回
累加器
本身,使其生效

const reducer = (accumulator, currentValue) => (accumulator.a += currentValue.a, accumulator);
演示

const数组=[{
a:1
}, {
a:2
}];
常量减速机=(累加器,currentValue)=>(累加器.a+=currentValue.a,累加器);
console.log(array.reduce)(reducer{
a:0

}));当您的
累加器
是一个对象时,您的
减速机
返回一个数值(累加器.a+当前值.a的总和)

初始化
累加器
0
或返回
累加器
本身,使其生效

const reducer = (accumulator, currentValue) => (accumulator.a += currentValue.a, accumulator);
演示

const数组=[{
a:1
}, {
a:2
}];
常量减速机=(累加器,currentValue)=>(累加器.a+=currentValue.a,累加器);
console.log(array.reduce)(reducer{
a:0

}));您需要根据需要更改减速器功能

const reducer = (accumulator, currentValue) => ({ a: accumulator.a + currentValue.a });

原始代码不起作用,因为您返回的是一个
数字,而不是您正在访问其属性的对象。

您需要将reducer函数更改为

const reducer = (accumulator, currentValue) => ({ a: accumulator.a + currentValue.a });

当您返回一个
Number
而不是您正在访问其属性的对象时,您的原始代码不起作用。

您第一次尝试使用
const数组=[{a:1},{a:2},{a:3}]。因为在第一次迭代之后,累加器将是一个数字。这是否回答了您的问题?或者更好:。您的第一次尝试无法使用
const数组=[{a:1},{a:2},{a:3}]。因为在第一次迭代之后,累加器将是一个数字。这是否回答了您的问题?或者更好:。