如何从L1中筛选出未包含L2全部元素的ID列表?
解决方法:找出未包含L2所有元素的ID
你的需求是筛选出L1中对应id的所有name未完全覆盖L2元素的id,原代码逻辑错误——它只是收集了那些单个name不在L2中的id,而非检查整个id对应的name集合是否包含L2的全部元素。
正确实现代码
let L1 = [ { id: 1, name: 'Object 1' }, { id: 1, name: 'Object 2' }, { id: 1, name: 'Object 3' }, { id: 2, name: 'Object 1' }, { id: 2, name: 'Object 2' }, { id: 3, name: 'Object 1' }, { id: 3, name: 'Object 3' } ]; let L2 = ['Object 1', 'Object 3']; // 第一步:按id分组,收集每个id对应的所有name const groupedById = L1.reduce((groups, item) => { if (!groups[item.id]) { groups[item.id] = new Set(); } groups[item.id].add(item.name); return groups; }, {}); // 第二步:筛选出未包含L2所有元素的id const targetIds = Object.keys(groupedById).filter(id => { const names = groupedById[id]; // 检查L2的每个元素是否都在当前id的name集合中 return !L2.every(name => names.has(name)); }).map(Number); // 把字符串id转成数字 console.log(targetIds); // 输出:[2]
代码说明
- 用
reduce+Set按id分组,避免重复存储同一个name,提升检查效率 - 用
every方法验证L2的所有元素是否都存在于当前id的name集合中,取反后就是不符合要求的id - 最后把字符串类型的id转为数字,和原数据类型一致
内容的提问来源于stack exchange,提问作者Karim Ali
相关产品推荐
相关产品推荐

