You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);

修正说明

  1. 变量初始化:所有数组和数值变量提前声明并赋予初始值,彻底解决NaN问题。
  2. 简化金额提取:利用数组固定结构直接取金额,去掉冗余的嵌套循环。
  3. 修正平均值逻辑:直接对变化量求和后除以变化量数量,得到正确平均值。
  4. 边界处理:判断变化量数组长度,避免单月份数据时出现除以0的错误。

内容的提问来源于stack exchange,提问作者Matthew Osborne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 10:20:43