gpt4 book ai didi

javascript - 使用reduce 的对象数组中的字段总和返回NaN

转载 作者:行者123 更新时间:2023-12-01 02:14:01 24 4
gpt4 key购买 nike

我发现 reduce 有奇怪的行为JavaScript 中的函数。

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

[ { a:1 }, {a:2}, ... ]

我需要 a 的总和每个对象中都有属性,所以我写了这个:

const array = [{a:1}, {a:2}];
const reducer = (accumulator, currentValue) => accumulator.a + currentValue.a;
console.log(array.reduce(reducer));

这按预期工作。

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

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我不明白为什么。谁能给我解释一下吗?

最佳答案

当使用 Array.reduce() 时,如果不指定初始值,则数组的第一项将成为初始值。由于您想要一个数字,而不是一个对象作为结果,因此使用 0 进行初始化。由于累加器现在是一个数字,而不是一个对象,因此使用 accumulator而不是accumulator.a在函数体内:

const array = [{a:1}, {a:2}, {a:3}];
const reducer = (accumulator, currentValue) => accumulator + currentValue.a;
console.log(array.reduce(reducer, 0));

您还可以检查累加器是否是一个对象,然后尝试访问它的属性,但我发现它比简单地声明初始值更令人困惑:

const array = [{a:1}, {a:2}, {a:3}];
const reducer = (accumulator, currentValue) => (typeof accumulator === 'object' ? accumulator.a : accumulator) + currentValue.a;
console.log(array.reduce(reducer));

关于javascript - 使用reduce 的对象数组中的字段总和返回NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49575058/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com