纯JavaScript实现多对象数组ID交集提取及代码问题排查
解决多数组对象按ID交集且arrayPicklist值不同的问题
你的需求很明确:在纯JavaScript环境下,从多个包含重复ID的对象数组中,提取满足两个条件的对象集合:
- ID在至少两个数组中存在(交集)
- 对应ID的
arrayPicklist值在不同数组中有至少两种不同的取值
原代码的问题在于,它只是简单找出了ID在所有数组中都存在的对象,但没有判断arrayPicklist值的差异,而且返回的结构也不符合预期。下面是调整后的解决方案:
实现思路
- 统计每个ID的元数据:遍历所有数组,记录每个ID出现过的
arrayPicklist值(去重),以及该ID涉及的数组数量 - 筛选符合条件的ID:留下那些
arrayPicklist值至少有2种不同取值,且在至少2个数组中出现的ID - 生成结果数组:从原数组中收集对应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
相关产品推荐
相关产品推荐

