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

对比含不同键集的两个数组,提取匹配对象的差异项

数组对象匹配与差异对比实现方案

核心需求

  • 以 id、make、product、color 作为匹配键,找出两个数组中匹配键完全一致的对象对
  • 仅对比两个对象的共同字段,若存在值差异,将Arr1中的完整对象存入Arr3,并标注差异字段
  • 忽略仅在单个数组中存在的对象

实现思路

  1. 为Arr2创建匹配键索引:将每个对象的匹配键值拼接成唯一标识,作为索引键,快速定位匹配对象
  2. 遍历Arr1的每个对象,通过匹配键索引查找Arr2中的对应对象
  3. 提取两个对象的共同字段,逐一对比值是否相等
  4. 若存在字段值差异,将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 16:46:14