如何使用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解决方案?
解决方案
可以通过映射查找+数组遍历的方式高效实现需求,步骤如下:
- 将其中一个数组转换为以
id为键的映射对象,实现O(1)时间复杂度的快速查找; - 遍历另一个数组,匹配对应
id的数据并计算差值; - 按照目标结构生成结果数组,同时处理可能的
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
相关产品推荐
相关产品推荐

