gpt4 book ai didi

javascript - 简单的 Reduce 函数 - JavaScript

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:11:45 24 4
gpt4 key购买 nike

我在一个 super 简单的数据集上使用 reduce 函数,结果得到了 NaN,这是我没想到的:

let students = [{name: 'Leah', grade: 94},{name: 'Savannah', grade: 73},{name: 'Killian', grade: 38}];

let highest = students.reduce(
(high, current) => Math.max(high.grade, current.grade)
)

console.log(highest); // outputs NaN

奇怪的是,如果我将第一行更改为以下内容:(只取出第三个对象)

let students = [{name: 'Leah', grade: 94},{name: 'Savannah', grade: 73}];

然后这会正确运行并输出 94。


为什么添加一个额外的对象会导致问题?

最佳答案

这都与累加器中的内容 (high) 有关。如果您不为 reduce 提供第二个参数,累加器将作为第一个对象开始,当前元素是第二个元素。在您的第一次迭代中,您将累加器视为对象,使用 high.grade 获取成绩;但随后您返回一个数字 (94),而不是一个对象,作为您的下一个累加器。在循环的下一次迭代中,high 不再是对象而是 94,并且 (94).grade 没有意义。

当你移除第三个元素时,没有第二次迭代,也来不及发生bug,你得到的是当前累加器的值(94)。如果只有一个元素,您将获得初始累加器 ({name: 'Leah', grade: 94})。显然,这并不理想,因为您无法可靠地预测计算结果的形状(对象、数字或错误)。

您需要决定是要数字还是对象,一个还是另一个。

let highest = students.reduce(
(high, current) => Math.max(high, current.grade),
Number.NEGATIVE_INFINITY
)

此变体将累加器保留为数字,并将返回 94。我们不能依赖默认的起始累加器,因为它需要是一个数字,所以我们人为地将它设置为 -INF

let highest = students.reduce(
(high, current) => high.grade > current.grade ? high : current,
)

这是对象版本,highest{name: 'Leah', grade: 94} 结尾。

关于javascript - 简单的 Reduce 函数 - JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45294024/

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