Javascript 中的 reduce.method 中的索引参数如何工作
how does the index argument work in the reduce.method in Javascript
我试图理解 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 函数似乎最初为“acc”分配正在循环的第一个元素的类型,然后它才知道您将用它做什么(可能是数学或字符串操作)。你正在尝试做数学。
在第一种情况下,类型是一个数字,所以一切都很好,但在第二种情况下,它是一个对象。因此,在第二种情况下,您要将数字 (el.price) 添加到对象 ({name: "Bike", price: 100}),从而将其转换为字符串。从现在开始,您只需连接字符串,而不是进行数学计算。
通过将 acc 设置为 0,您可以重新为其分配一种数字类型,这样它就可以工作了。
所以我认为最好总是在 reduce 函数中分配 acc 以避免这些类型的错误。
reducer 函数(在本例中为 const reducer =...)的 return 被分配给累加器,并且它在每次迭代中都被“记住”,所以如果您尝试这种方式:
const reducer = (accumulator, currentValue) => ({
price: accumulator.price + currentValue.price
});
items.reduce(reducer);
// console.log outputs { price: 1815 }
因为你正在处理对象,所以你需要 return 一个对象,因为如果你 return 只是 (acc, cur) => acc.price + cur.price
你会得到一个 NaN 错误,因为数字与对象不兼容(而reducer函数的return赋值给了累加器)。
检查这些控制台日志,我相信它们将有助于了解减速器发生了什么:
注意reducer第一次运行累加器是数组的索引0。
如果您有任何其他问题,请在下面的评论中告诉我。
我试图理解 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 函数似乎最初为“acc”分配正在循环的第一个元素的类型,然后它才知道您将用它做什么(可能是数学或字符串操作)。你正在尝试做数学。
在第一种情况下,类型是一个数字,所以一切都很好,但在第二种情况下,它是一个对象。因此,在第二种情况下,您要将数字 (el.price) 添加到对象 ({name: "Bike", price: 100}),从而将其转换为字符串。从现在开始,您只需连接字符串,而不是进行数学计算。
通过将 acc 设置为 0,您可以重新为其分配一种数字类型,这样它就可以工作了。
所以我认为最好总是在 reduce 函数中分配 acc 以避免这些类型的错误。
reducer 函数(在本例中为 const reducer =...)的 return 被分配给累加器,并且它在每次迭代中都被“记住”,所以如果您尝试这种方式:
const reducer = (accumulator, currentValue) => ({
price: accumulator.price + currentValue.price
});
items.reduce(reducer);
// console.log outputs { price: 1815 }
因为你正在处理对象,所以你需要 return 一个对象,因为如果你 return 只是 (acc, cur) => acc.price + cur.price
你会得到一个 NaN 错误,因为数字与对象不兼容(而reducer函数的return赋值给了累加器)。
检查这些控制台日志,我相信它们将有助于了解减速器发生了什么:
注意reducer第一次运行累加器是数组的索引0。
如果您有任何其他问题,请在下面的评论中告诉我。