Javascript 带有reduce()和forEach()的非基元数组元素之和

Javascript 带有reduce()和forEach()的非基元数组元素之和,javascript,arrays,cumulative-sum,Javascript,Arrays,Cumulative Sum,我使用了以下代码,无法解释结果为何不同: 让foo=[]; 让bar=[…foo{ a:1 }, { a:2 }]; 让sum=bar.reduce((a,b)=>a.a+b.a,0); console.log(总和);//版画南 总和=0; bar.forEach((元素)=>{ 总和+=元素a; }); console.log(总和);//打印3问题是reduce()链,您需要返回一个值,该值可以是“下一个a”。由于您在整数上引用了a.a,因此它进入了NaN区域 let sum=bar.r

我使用了以下代码,无法解释结果为何不同:

让foo=[];
让bar=[…foo{
a:1
}, {
a:2
}];
让sum=bar.reduce((a,b)=>a.a+b.a,0);
console.log(总和);//版画南
总和=0;
bar.forEach((元素)=>{
总和+=元素a;
});

console.log(总和);//打印3
问题是
reduce()
链,您需要返回一个值,该值可以是“下一个
a
”。由于您在整数上引用了
a.a
,因此它进入了
NaN
区域

let sum=bar.reduce((a,b)=>({a:a.a+b.a}),{a:0});
一种可能更有效的方法是首先规范化值:

let sum=bar.map(a=>a.a).reduce((a,b)=>a+b,0);

现在它只是一个简单的数字数组。

问题是
reduce()
链,您需要返回一个值,该值可以是“下一个
a
”。由于您在整数上引用了
a.a
,因此它进入了
NaN
区域

let sum=bar.reduce((a,b)=>({a:a.a+b.a}),{a:0});
一种可能更有效的方法是首先规范化值:

let sum=bar.map(a=>a.a).reduce((a,b)=>a+b,0);
现在它只是一个简单的数字数组。

函数的第一个参数是累加器。根据定义

累加器累加回调函数的返回值。它是在上一次调用回调或initialValue时返回的累积值(如果已提供)(请参见下文)

如果您从
a.a
更改为
a
,则它应该可以工作

let sum = bar.reduce((a, b) => a + b.a, 0);
函数的第一个参数是累加器。根据定义

累加器累加回调函数的返回值。它是在上一次调用回调或initialValue时返回的累积值(如果已提供)(请参见下文)

如果您从
a.a
更改为
a
,则它应该可以工作

let sum = bar.reduce((a, b) => a + b.a, 0);

您的问题是
中的
a
(a,b)=>
reduce
的累加器,它从
0
开始(第二个参数)。这意味着它没有
a
属性,因此所有后续的求和结果都是
NaN
,因为您将数字添加到
未定义的
(以及后续的
NaN
)。要解决此问题,只需删除对
.a
的引用:

让foo=[];
让bar=[…foo{
a:1
}, {
a:2
}];
设总和=巴减((a,b)=>a+b.a,0);

console.log(总和);//打印3
您的问题是
中的
a
(a,b)=>
reduce
的累加器,它从
0
开始(第二个参数)。这意味着它没有
a
属性,因此所有后续的求和结果都是
NaN
,因为您将数字添加到
未定义的
(以及后续的
NaN
)。要解决此问题,只需删除对
.a
的引用:

让foo=[];
让bar=[…foo{
a:1
}, {
a:2
}];
设总和=巴减((a,b)=>a+b.a,0);

console.log(总和);//打印3
传递给reduce函数的初始值为0,即a=0,并尝试在未定义的+1上进行计算,该+1返回NaN。您可以执行以下任一操作:

  • 在不传递初始值的情况下:

    减少(a,b)=>a.a+b.a)

  • 通过传递初始值,但此处需要使用映射:

    条形图(a=>a.a).reduce((a,b)=>a+b,0)


  • 不过,还有更多的方法。您可以获得更多

    传递给reduce函数的初始值为0,即a=0,并尝试在未定义的+1上进行计算,该+1返回NaN。您可以执行以下任一操作:

  • 在不传递初始值的情况下:

    减少(a,b)=>a.a+b.a)

  • 通过传递初始值,但此处需要使用映射:

    条形图(a=>a.a).reduce((a,b)=>a+b,0)


  • 不过,还有更多的方法。您可以获得更多信息。

    a.a
    未定义,因为a在第一次迭代中为0
    (a,b)=>a+b.a
    给出了预期结果;
    reduce
    中的累加器是一个整数,而不是一个对象。reduce((a,b)=>((a&a.a)?a.a:0)+b.a,0)或者可能是
    bar。reduce((a,b)=>({a:a.a+b.a}),{a:0}
    它将返回
    {a:3}
    @Nick我想我必须研究一下。我通常看到缩减是按照我在问题中写的方式写的,我假设
    a
    b
    都是数组元素。绝对不是打字错误。
    a.a
    未定义,因为在第一次迭代中a是0
    (a,b)=>a+b.a
    给出了预期结果;
    reduce
    中的累加器是一个整数,而不是一个对象。reduce((a,b)=>((a&a.a)?a.a:0)+b.a,0)或者可能是
    bar。reduce((a,b)=>({a:a.a+b.a}),{a:0}
    它将返回
    {a:3}
    @Nick我想我必须研究一下。我通常看到缩减是按照我在问题中写的方式写的,我假设
    a
    b
    都是数组元素。绝对不是打字错误。不完全正确,尽管这更接近了。@tadman将逻辑从a.a更新到另一个不完全正确,尽管这更接近了。@tadman将逻辑从a.a更新到a