如何对比两个对象数组并生成包含差异的新对象数组?
对象数组差异对比实现
需求说明
对比两个对象数组,生成包含新旧属性差异的新对象数组:当原数组有对应索引的对象时,保留新旧属性值;原数组无对应对象时,旧属性值设为null。
示例输入
const objA = [{"name":"Karthi","age":25,"education":"Masters","city":"Chennai","country":"India"}] const objB = [{"name":"Meenakshi","age":28,"education":"UG","city":"Pune","country":"India"},{"name":"Mani","age":31,"education":"Masters","city":"Madurai","country":"India"}]
预期输出
[{"oldName":"Karthi","newName":"Meenakshi","oldAge":25,"newAge":28,"oldEducation":"Masters","newEducation":"UG","oldCity":"Chennai","newCity":"Pune","country":"India"},{"oldName":null,"newName":"Mani","oldAge":null,"newAge":31,"oldEducation":null,"newEducation":"Masters","oldCity":null,"newCity":"Madurai","country":"India"}]
代码实现
function compareObjectArrays(arrA, arrB) { return arrB.map((newObj, index) => { const result = {}; const oldObj = arrA[index] || {}; Object.keys(newObj).forEach(key => { // 按示例规则,country属性直接保留新值 if (key === 'country') { result[key] = newObj[key]; return; } // 生成新旧属性键名,旧值不存在时设为null const capitalizedKey = key.charAt(0).toUpperCase() + key.slice(1); result[`old${capitalizedKey}`] = oldObj[key] ?? null; result[`new${capitalizedKey}`] = newObj[key]; }); return result; }); } // 测试示例 const objA = [{"name":"Karthi","age":25,"education":"Masters","city":"Chennai","country":"India"}]; const objB = [{"name":"Meenakshi","age":28,"education":"UG","city":"Pune","country":"India"},{"name":"Mani","age":31,"education":"Masters","city":"Madurai","country":"India"}]; console.log(compareObjectArrays(objA, objB));
逻辑说明
- 以目标数组
arrB为基准,遍历每个对象生成差异项 - 匹配
arrA对应索引的对象,无对应对象则用空对象兜底 - 对每个属性做差异化处理:
country属性直接保留新对象的值(符合示例规则)- 其他属性生成
oldXxx和newXxx格式的键名,旧值不存在时设为null
- 最终返回整理后的差异对象数组
内容的提问来源于stack exchange,提问作者karthi
相关产品推荐
相关产品推荐

