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

纯JavaScript实现多对象数组ID交集提取及代码问题排查

解决多数组对象按ID交集且arrayPicklist值不同的问题

你的需求很明确:在纯JavaScript环境下,从多个包含重复ID的对象数组中,提取满足两个条件的对象集合:

  • ID在至少两个数组中存在(交集)
  • 对应ID的arrayPicklist值在不同数组中有至少两种不同的取值

原代码的问题在于,它只是简单找出了ID在所有数组中都存在的对象,但没有判断arrayPicklist值的差异,而且返回的结构也不符合预期。下面是调整后的解决方案:

实现思路

  1. 统计每个ID的元数据:遍历所有数组,记录每个ID出现过的arrayPicklist值(去重),以及该ID涉及的数组数量
  2. 筛选符合条件的ID:留下那些arrayPicklist值至少有2种不同取值,且在至少2个数组中出现的ID
  3. 生成结果数组:从原数组中收集对应ID的唯一{Id, arrayPicklist}组合

完整代码实现

const buckets = [
  [{"Id":"123","arrayPicklist":"Categorie__c"}],
  [{"Id":"123","arrayPicklist":"Regio__c"}],
  [{"Id":"124","arrayPicklist":"Categorie__c"}],
  [{"Id":"123","arrayPicklist":"Regio__c"},{"Id":"125","arrayPicklist":"Regio__c"},{"Id":"123","arrayPicklist": "Regio__c"},{"Id":"126","arrayPicklist":"Regio__c"}]
];

function getTargetIntersection(buckets) {
  // 统计每个ID的相关信息:picklist值集合、出现的数组索引集合
  const idMap = new Map();
  
  buckets.forEach((bucket, bucketIndex) => {
    bucket.forEach(obj => {
      const { Id, arrayPicklist } = obj;
      if (!idMap.has(Id)) {
        idMap.set(Id, {
          picklistValues: new Set(),
          bucketIndices: new Set()
        });
      }
      const idData = idMap.get(Id);
      idData.picklistValues.add(arrayPicklist);
      idData.bucketIndices.add(bucketIndex);
    });
  });
  
  // 筛选符合条件的ID:至少2个不同picklist值,且在至少2个数组中出现
  const validIds = [...idMap.entries()]
    .filter(([_, data]) => data.picklistValues.size >= 2 && data.bucketIndices.size >= 2)
    .map(([id]) => id);
  
  // 收集唯一的{Id, arrayPicklist}对象
  const resultSet = new Set();
  buckets.forEach(bucket => {
    bucket.forEach(obj => {
      if (validIds.includes(obj.Id)) {
        // 用字符串作为Set的键来去重
        const key = `${obj.Id}-${obj.arrayPicklist}`;
        if (!resultSet.has(key)) {
          resultSet.add(key);
          // 深拷贝对象避免原引用问题
          resultSet.add(JSON.parse(JSON.stringify(obj)));
        }
      }
    });
  });
  
  // 转换为数组返回
  return [...resultSet].filter(item => typeof item !== 'string');
}

const intersection = getTargetIntersection(buckets);
console.log(intersection);
// 输出:[{"Id":"123","arrayPicklist":"Categorie__c"},{"Id":"123","arrayPicklist":"Regio__c"}]

代码说明

  • 使用Map和Set来高效统计和去重,避免重复计算
  • 先筛选出符合条件的ID,再收集对应的唯一对象组合,保证结果简洁
  • 用JSON.parse(JSON.stringify(obj))做对象深拷贝,避免后续操作影响原数组对象

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:45:56