JavaScript Reduce函数返回NaN:计算笔记本总收益异常求助
解决reduce计算笔记本总收益返回NaN的问题
你的问题出在部分日期对应的cur值是数字0,此时cur?.laptop?.totalrev会返回undefined,而数字与undefined相加会得到NaN,最终导致整个reduce结果异常。
原问题代码
对象结构:
const obj = { "2024-02-08": { "mobile": { "total": 2, "totalrev": 36 }, "laptop": { "total": 3, "totalrev": 535 } }, "2024-02-09": 0, "2024-02-10": 0, "2024-02-11": 0, "2024-02-12": { "mobile": { "total": 5, "totalrev": 0 }, "laptop": { "total": 2, "totalrev": 0 } }, "2024-02-13": 0, "2024-02-14": 0, "2024-02-15": 0, "2024-02-16": 0 }
出错的reduce代码:
const totalRevFromLaptop = Object.values(obj).reduce( (acc, cur) => acc + cur?.laptop?.totalrev, 0 );
修复方案
使用空值合并运算符??,当cur?.laptop?.totalrev为undefined时,自动替换为0,避免数字与undefined相加:
const totalRevFromLaptop = Object.values(obj).reduce( (acc, cur) => acc + (cur?.laptop?.totalrev ?? 0), 0 );
或者也可以先判断当前值是否为对象,再进行累加,逻辑更清晰:
const totalRevFromLaptop = Object.values(obj).reduce( (acc, cur) => { // 仅当cur是对象且不为null时,才尝试获取laptop的收益 if (typeof cur === 'object' && cur !== null) { return acc + (cur.laptop?.totalrev ?? 0); } // 非对象类型直接返回累加值 return acc; }, 0 );
两种方案都能正确计算出笔记本设备的总收益,结果为535(2024-02-08的535加上2024-02-12的0)。
内容的提问来源于stack exchange,提问作者Tick Twitch
相关产品推荐
相关产品推荐

