JavaScript中按name字段处理三数组交集问题求助
问题解决:正确获取数组交集并过滤目标数组
你的代码用了两次map,但map的作用是转换每个元素并返回新数组,所以得到的是布尔值组成的二维数组,而非你需要的交集name集合。下面是正确的实现方案:
步骤拆解
- 提取array1的所有name并转为Set(提升后续查找效率)
- 从array2中筛选出name存在于array1集合中的元素,得到两者的交集name列表
- 用交集name列表过滤array3,保留匹配的元素
完整代码
const array1 = [{ name: 'John' }]; const array2 = [{ name: 'Elisa' }, { name: 'John' }]; const array3 = [{ name: 'Elisa', age: 10 }, { name: 'John', age: 23 }, { name: 'Maria', age: 30 }]; // 1. 提取array1的name集合 const array1Names = new Set(array1.map(item => item.name)); // 2. 找出array2与array1的交集name(自动去重) const intersectNames = [...new Set(array2.filter(item => array1Names.has(item.name)).map(item => item.name))]; // 3. 过滤array3,保留name在交集内的元素 const filteredArray = array3.filter(item => intersectNames.includes(item.name)); console.log(filteredArray); // 输出: [{ name: 'John', age: 23 }]
代码说明
- 用
Set存储array1的name,因为Set.has()的查找时间复杂度为O(1),比数组includes()更高效 - 交集name用
new Set去重,避免array2中存在重复name的情况 - 最后用
array3.filter()直接筛选符合条件的元素,这才是实现过滤需求的正确方法(而非map)
内容的提问来源于stack exchange,提问作者Tiago Silva
相关产品推荐
相关产品推荐

