Indexing 在Javascript中,index参数如何在reduce.method中工作

Indexing 在Javascript中,index参数如何在reduce.method中工作,indexing,reduce,Indexing,Reduce,我试图理解reduce方法,但是我被一些事情卡住了。如果我写: const myArr = [1, 2, 3, 4, 7, 5]; const sum = myArr.reduce((acc,el)=>{ return acc+el }); console.log(`The sum is ${sum}`); 我得到了22的正确输出,这是我的总和 但如果我写这封信: const items = [{ name: "Bike", price: 100 }, {

我试图理解reduce方法,但是我被一些事情卡住了。如果我写:

const myArr = [1, 2, 3, 4, 7, 5];


const sum = myArr.reduce((acc,el)=>{
return acc+el

});


console.log(`The sum is ${sum}`);
我得到了22的正确输出,这是我的总和

但如果我写这封信:

const items = [{
name: "Bike",
price: 100
},
{
name: "TV",
price: 200
},
{
name: "Album",
price: 10
},
{
name: "Book",
price: 5
},
{
name: "Phone",
price: 500
},
{
name: "Computer",
price: 1000
}
]


const total = items.reduce((acc, el) => {
  return acc + el.price
});


console.log(total);
除非我将索引初始化为0,否则我不会得到总数。我不明白为什么在第一种情况下有效,但在第二种情况下无效。
谢谢你的帮助

在.reduce函数知道您将使用它做什么(可能是数学或字符串操作)之前,.reduce函数似乎一开始就为“acc”分配了循环中的第一个元素的类型。你在试着做数学

在第一种情况下,类型是一个数字,所以一切正常,但在第二种情况下,它是一个对象。因此,在第二种情况下,您将向对象({name:“Bike”,price:100})添加一个数字(el.price),从而将其转换为字符串。从现在开始,您将只是连接字符串,而不是进行数学运算

通过将acc设置为0,ur将其重新分配为一种数字类型,因此它可以工作


因此,我认为在reduce函数中始终分配acc是一种很好的做法,以避免这些类型的错误。

reducer函数的返回(在本例中,const reducer=…)被分配给累加器,并且在每次迭代中都会被“记住”,因此如果您尝试这种方法:

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

items.reduce(reducer);

// console.log outputs { price: 1815 }
因为您正在处理对象,所以需要返回一个对象,因为如果您只返回
(acc,cur)=>acc.price+cur.price
,您会得到一个NaN错误,因为数字与对象不兼容(并且减速机函数的返回被分配给累加器)

检查这些控制台日志,我相信它们将有助于了解减速器的情况:

请注意,减速机第一次运行累加器时是数组的索引0

如果您在下面的评论中有任何其他问题,请告诉我