JavaScript二维数组:计算每月金额变化量及平均值(解决NaN问题)
问题排查与解决方案:计算月度金额变化量平均值返回NaN
我有一个包含日期与金额的二维数组:
var finances = [ ['jan', 25000], ['feb', 22000], ['mars', 21000] ]
想要计算每月金额的变化量,再求这些变化量的平均值,但代码运行后得到NaN结果,无法获得正确数值,以下是我的实现代码:
var finances = [ ['Jan-2010', 867884], ['Feb-2010', 984655], ['Mar-2010', 322013], ['Apr-2010', -69417], ['May-2010', 310503], ['Jun-2010', 522857], ['Jul-2010', 1033096], ['Aug-2010', 604885], ['Sep-2010', -216386], ['Oct-2010', 477532], ['Nov-2010', 893810], ['Dec-2010', -80353], ['Jan-2011', 779806], ['Feb-2011', -335203], ['Mar-2011', 697845], ['Apr-2011', 793163], ['May-2011', 485070], ['Jun-2011', 584122], ['Jul-2011', 62729], ['Aug-2011', 668179], ['Sep-2011', 899906], ['Oct-2011', 834719], ['Nov-2011', 132003], ['Dec-2011', 309978], ['Jan-2012', -755566], ['Feb-2012', 1170593], ['Mar-2012', 252788], ['Apr-2012', 1151518], ['May-2012', 817256], ['Jun-2012', 570757], ['Jul-2012', 506702], ['Aug-2012', -1022534], ['Sep-2012', 475062], ['Oct-2012', 779976], ['Nov-2012', 144175], ['Dec-2012', 542494], ['Jan-2013', 359333], ['Feb-2013', 321469], ['Mar-2013', 67780], ['Apr-2013', 471435], ['May-2013', 565603], ['Jun-2013', 872480], ['Jul-2013', 789480], ['Aug-2013', 999942], ['Sep-2013', -1196225], ['Oct-2013', 268997], ['Nov-2013', -687986], ['Dec-2013', 1150461], ['Jan-2014', 682458], ['Feb-2014', 617856], ['Mar-2014', 824098], ['Apr-2014', 581943], ['May-2014', 132864], ['Jun-2014', 448062], ['Jul-2014', 689161], ['Aug-2014', 800701], ['Sep-2014', 1166643], ['Oct-2014', 947333], ['Nov-2014', 578668], ['Dec-2014', 988505], ['Jan-2015', 1139715], ['Feb-2015', 1029471], ['Mar-2015', 687533], ['Apr-2015', -524626], ['May-2015', 158620], ['Jun-2015', 87795], ['Jul-2015', 423389], ['Aug-2015', 840723], ['Sep-2015', 568529], ['Oct-2015', 332067], ['Nov-2015', 989499], ['Dec-2015', 778237], ['Jan-2016', 650000], ['Feb-2016', -1100387], ['Mar-2016', -174946], ['Apr-2016', 757143], ['May-2016', 445709], ['Jun-2016', 712961], ['Jul-2016', -1163797], ['Aug-2016', 569899], ['Sep-2016', 768450], ['Oct-2016', 102685], ['Nov-2016', 795914], ['Dec-2016', 60988], ['Jan-2017', 138230], ['Feb-2017', 671099] ]; for (var i = 0; i < finances.length; i++) { for (var j = 0; j < finances[i].length; j++) { if (typeof finances[i][j] !== 'string') { onlyNumbers.push(finances[i][j]) console.log(finances[i][j]); amountTotal = amountTotal + (finances[i][j]); } } } for (var k = 1; k < onlyNumbers.length; k++) { monthlyChanges.push(onlyNumbers[k] - onlyNumbers[k - 1]); } for (var m = 1; m < monthlyChanges.length; m++) { monthlyChangesArray.push(monthlyChanges[m] - monthlyChanges[m - 1]); monthlyChangesAmount = monthlyChangesAmount + (monthlyChangesArray[m]); } console.log(onlyNumbers); console.log(amountTotal); console.log(monthlyChanges); console.log(monthlyChangesArray); console.log(monthlyChangesAmount);
错误原因分析
- 变量未初始化:
onlyNumbers、amountTotal、monthlyChanges等变量未提前声明并初始化,默认值为undefined,参与算术运算后直接得到NaN。 - 逻辑偏差:第二个循环计算的是「变化量的差值」,而非对变化量求和来计算平均值,完全偏离了需求。
修正后的代码
var finances = [ // 保留原数组所有内容 ['Jan-2010', 867884], ['Feb-2010', 984655], // ... 省略中间元素 ['Feb-2017', 671099] ]; // 初始化所有变量,避免undefined参与运算 var onlyNumbers = []; var amountTotal = 0; var monthlyChanges = []; var monthlyChangesSum = 0; var averageChange = 0; // 提取金额并计算总金额(简化逻辑,直接取子数组第二个元素) for (var i = 0; i < finances.length; i++) { var amount = finances[i][1]; onlyNumbers.push(amount); amountTotal += amount; } // 计算每月变化量并累加总和 for (var k = 1; k < onlyNumbers.length; k++) { var change = onlyNumbers[k] - onlyNumbers[k - 1]; monthlyChanges.push(change); monthlyChangesSum += change; } // 计算平均值,增加边界判断避免除以0 if (monthlyChanges.length > 0) { averageChange = monthlyChangesSum / monthlyChanges.length; // 保留两位小数,符合金额展示习惯 averageChange = Math.round(averageChange * 100) / 100; } // 输出结果 console.log("提取的金额数组:", onlyNumbers); console.log("总金额:", amountTotal); console.log("每月变化量:", monthlyChanges); console.log("变化量总和:", monthlyChangesSum); console.log("变化量平均值:", averageChange);
修正说明
- 变量初始化:所有数组和数值变量提前声明并赋予初始值,彻底解决
NaN问题。 - 简化金额提取:利用数组固定结构直接取金额,去掉冗余的嵌套循环。
- 修正平均值逻辑:直接对变化量求和后除以变化量数量,得到正确平均值。
- 边界处理:判断变化量数组长度,避免单月份数据时出现除以0的错误。
内容的提问来源于stack exchange,提问作者Matthew Osborne
相关产品推荐
相关产品推荐

