qar*_*dso 3 javascript reduce ecmascript-6
我正在使用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
Run Code Online (Sandbox Code Playgroud)
奇怪的是,如果我将第一行更改为以下内容:(只取出第三个对象)
let students = [{name: 'Leah', grade: 94},{name: 'Savannah', grade: 73}];
Run Code Online (Sandbox Code Playgroud)
然后这运行正确并输出94.
为什么添加一个额外的对象会导致问题?
这一切都与累加器(high)中的内容有关.如果不提供第二个参数reduce,则累加器将作为第一个对象启动,而当前元素是第二个元素.在第一次迭代中,将累加器视为对象,使用获取等级high.grade; 但是你返回一个数字(94),而不是一个对象,成为你的下一个累加器.在循环的下一次迭代中,high不再是一个对象94,而且(94).grade没有任何意义.
删除第三个元素时,没有第二次迭代,并且没有时间发生错误,并且您获得当前累加器(94)的值.如果只有一个元素,你将获得初始累加器({name: 'Leah', grade: 94}).显然,这并不理想,因为您无法可靠地预测计算结果的形状(对象,数字或错误).
您需要决定是否需要数字或对象,一个或另一个.
let highest = students.reduce(
(high, current) => Math.max(high, current.grade),
Number.NEGATIVE_INFINITY
)
Run Code Online (Sandbox Code Playgroud)
此变量将累加器保持为数字,并将返回94.我们不能依赖默认的起始累加器,因为它需要是一个数字,所以我们人为设置它-INF.
let highest = students.reduce(
(high, current) => high.grade > current.grade ? high : current,
)
Run Code Online (Sandbox Code Playgroud)
这是对象版本,highest最终以{name: 'Leah', grade: 94}.
| 归档时间: |
|
| 查看次数: |
59 次 |
| 最近记录: |