尝试汇总各联系人月度数值时出现NaN问题,求排查
问题描述
我有一个包含offices(联系人)及各月份数值的对象:
let data = { offices : [], January : [], February : [], March : [], April : [], May : [], June : [], July : [], August : [], September : [], October : [], November : [], December : [], Total: [] };
我想要按月份汇总所有数值并展示在表格中,编写了如下循环代码:
for (let i = 0; i < result.length; i++) { let summ = 0; data.offices.push(result[i].office); data.January.push(result[i].months[0]); summ += data.January.amount; data.JanuaryTotal += result[i].months[0]; data.Total.push(summ); }
但运行后出现了NaN值,无法实现需求,请问我哪里出错了?
错误分析与修正
出现NaN的核心原因是几个逻辑错误:
data.January.amount是无效访问:data.January是数组,根本没有amount属性,直接取值会得到undefined,和数值相加就会变成NaN。data.JanuaryTotal未初始化:你的初始data对象里根本没定义这个属性,默认是undefined,直接累加数值必然得到NaN。summ的计算逻辑完全错误:每次循环把summ初始化为0,再加一个不存在的amount值,结果只能是NaN,最后存到Total里自然也是NaN。
修正后的代码
假设result中每个元素的months数组对应12个月的数值,我们可以这样改写代码:
// 先初始化各月份的汇总变量,避免未定义导致NaN const monthTotals = { January: 0, February: 0, March: 0, April: 0, May: 0, June: 0, July: 0, August: 0, September: 0, October: 0, November: 0, December: 0 }; const monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; for (let i = 0; i < result.length; i++) { const currentItem = result[i]; data.offices.push(currentItem.office); let currentTotal = 0; // 当前联系人的总数值 // 批量处理每个月份的数据 for (let j = 0; j < monthNames.length; j++) { const month = monthNames[j]; // 处理可能的空值,把undefined/null转为0 const monthValue = currentItem.months[j] ?? 0; data[month].push(monthValue); monthTotals[month] += monthValue; currentTotal += monthValue; } // 存入当前联系人的总数值 data.Total.push(currentTotal); } // 把各月份的汇总结果挂载到data上,方便后续使用 data.monthlyTotals = monthTotals;
关键优化点
- 提前初始化月份汇总变量,避免未定义属性的累加操作
- 对月份数值做空值兜底,防止
undefined或null参与计算导致NaN - 用循环批量处理12个月,减少重复代码
- 单个联系人的总数值直接累加其所有月份数据,逻辑更清晰
内容的提问来源于stack exchange,提问作者Jhony
相关产品推荐
相关产品推荐

