对比含不同键集的两个数组,提取匹配对象的差异项
数组对象匹配与差异对比实现方案
核心需求
- 以
id、make、product、color作为匹配键,找出两个数组中匹配键完全一致的对象对 - 仅对比两个对象的共同字段,若存在值差异,将Arr1中的完整对象存入Arr3,并标注差异字段
- 忽略仅在单个数组中存在的对象
实现思路
- 为Arr2创建匹配键索引:将每个对象的匹配键值拼接成唯一标识,作为索引键,快速定位匹配对象
- 遍历Arr1的每个对象,通过匹配键索引查找Arr2中的对应对象
- 提取两个对象的共同字段,逐一对比值是否相等
- 若存在字段值差异,将Arr1的对象及差异字段列表存入Arr3
代码示例(JavaScript)
// 示例数据 const Arr1 = [ { state: 'CA', id: 1, name: 'aaa', product: 'car', color: 'white', make: 'toyota' }, { state: 'NY', id: 2, name: 'ccc', product: 'truck', color: 'black', make: 'ford' } ]; const Arr2 = [ { id: 1, name: 'bbb', product: 'car', color: 'white', mileage: 30, type: 'sedan', make: 'toyota' }, { id: 3, name: 'ddd', product: 'bike', color: 'red', mileage: 10, make: 'giant' } ]; // 定义匹配键 const matchKeys = ['id', 'make', 'product', 'color']; // 生成Arr2的匹配索引 const arr2Index = Arr2.reduce((index, obj) => { const key = matchKeys.map(k => obj[k]).join('|'); index[key] = obj; return index; }, {}); // 对比并生成Arr3 const Arr3 = Arr1.reduce((result, obj1) => { // 生成当前对象的匹配键标识 const matchKey = matchKeys.map(k => obj1[k]).join('|'); const obj2 = arr2Index[matchKey]; // 仅处理在Arr2中找到匹配的对象 if (obj2) { // 提取共同字段 const commonFields = Object.keys(obj1).filter(key => Object.prototype.hasOwnProperty.call(obj2, key)); // 收集差异字段 const diffFields = commonFields.filter(field => obj1[field] !== obj2[field]); // 存在差异则存入结果 if (diffFields.length > 0) { result.push({ ...obj1, diffFields // 新增差异字段标识 }); } } return result; }, []); console.log(Arr3); // 输出结果: // [ // { state: 'CA', id: 1, name: 'aaa', product: 'car', color: 'white', make: 'toyota', diffFields: ['name'] } // ]
代码说明
- 匹配索引生成:用
reduce将Arr2对象按匹配键拼接的唯一字符串分组,避免嵌套循环,提升查找效率 - 共同字段提取:通过
Object.keys和hasOwnProperty筛选两个对象都存在的字段 - 差异字段收集:对比共同字段的值,收集不相等的字段名,最终附加到结果对象中,方便后续识别差异
内容的提问来源于stack exchange,提问作者kkrfan1988
相关产品推荐
相关产品推荐

