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

如何使用JavaScript计算两个对象数组间的数值差异?

计算两个对象数组的数值差异(JavaScript实现)

我通过两次不同日期的API调用获取了两组数据集,希望使用JavaScript计算这两个对象数组中数值的差异。以下是两组数据集:

const arrayOne = [
        {
            id: 1,
            values: {
                sales: {
                    rawValue: 3,
                    value: '3.0',
                },
            },
        },
        {
            id: 2,
            values: {
                sales: {
                    rawValue: 1,
                    value: '1.0',
                },
            },
        },
    ];

const arrayTwo = [
        {
            id: 1,
            values: {
                sales: {
                    rawValue: 1.1,
                    value: '1.1',
                },
            },
        },
        {
            id: 2,
            values: {
                sales: {
                    rawValue: 2,
                    value: '2.0',
                },
            },
        },
    ];

我想要生成一个包含计算后差异值的新数组,结构如下:

const newArray = [
        {
            id: 1,
            values: {
                salesVar: {
                    rawValue: calculatedVariance,
                    value: 'calculatedVariance',
                },
            },
        },
        {
            id: 2,
            values: {
                salesVar: {
                    rawValue: calculatedVariance,
                    value: 'calculatedVariance',
                },
            },
        },
    ];

请问是否有可行的JavaScript解决方案?

解决方案

可以通过映射查找+数组遍历的方式高效实现需求,步骤如下:

  1. 将其中一个数组转换为以id为键的映射对象,实现O(1)时间复杂度的快速查找;
  2. 遍历另一个数组,匹配对应id的数据并计算差值;
  3. 按照目标结构生成结果数组,同时处理可能的id不匹配情况。

代码实现

// 将arrayTwo转为id映射,快速定位对应数据
const arrayTwoMap = arrayTwo.reduce((map, item) => {
    map[item.id] = item;
    return map;
}, {});

// 生成差异数组
const newArray = arrayOne.map(item => {
    const matchItem = arrayTwoMap[item.id];
    
    // 处理无匹配id的情况
    if (!matchItem) {
        return {
            id: item.id,
            values: {
                salesVar: {
                    rawValue: null,
                    value: 'null'
                }
            }
        };
    }

    // 计算rawValue差值(这里用arrayOne - arrayTwo,可根据需求调整)
    const rawVariance = item.values.sales.rawValue - matchItem.values.sales.rawValue;
    // 保持value字段为一位小数的字符串格式
    const valueVariance = rawVariance.toFixed(1);

    return {
        id: item.id,
        values: {
            salesVar: {
                rawValue: rawVariance,
                value: valueVariance
            }
        }
    };
});

console.log(newArray);

输出结果

运行上述代码后,得到的newArray为:

[
    {
        "id": 1,
        "values": {
            "salesVar": {
                "rawValue": 1.9,
                "value": "1.9"
            }
        }
    },
    {
        "id": 2,
        "values": {
            "salesVar": {
                "rawValue": -1,
                "value": "-1.0"
            }
        }
    }
]

说明

  • 使用reduce构建映射避免了嵌套循环,在数据量较大时性能更优;
  • 加入了id不匹配的容错处理,可根据实际业务需求修改(比如过滤无匹配项);
  • toFixed(1)保证了value字段的格式与原数据一致,若需要更多小数位数可调整参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 18:56:00