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。您可以执行以下任一操作:
不过,还有更多的方法。您可以获得更多传递给reduce函数的初始值为0,即a=0,并尝试在未定义的+1上进行计算,该+1返回NaN。您可以执行以下任一操作:
不过,还有更多的方法。您可以获得更多信息。
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