JavaScript如何获取多数组的交集?数组交集实现问题咨询
多数组交集的简便实现方法
嘿,我来给你分享几个简洁靠谱的方法,帮你快速找出所有数组共有的元素~你之前提到用某个方法时得到错误结果,后来发现是自己代码其他部分的问题,其实这类交集方法本身是没问题的,下面这些通用方案适用于任意数量的数组:
方法一:利用Set逐步缩小范围
Set的查找效率很高,适合用来快速判断元素是否存在。我们可以以第一个数组为基础创建Set,然后遍历剩下的数组,不断过滤出同时存在于当前Set中的元素,更新Set的范围,最后转成数组就是结果:
const arrays = [[1,2,3], [2,3,4], [2,4,5]]; // 初始交集设为第一个数组的Set let intersection = new Set(arrays[0]); // 遍历后续每个数组,逐步筛选交集 for (const arr of arrays.slice(1)) { intersection = new Set(arr.filter(item => intersection.has(item))); } // 转换为数组输出 console.log([...intersection]); // 输出 [2]
方法二:用reduce简化逻辑
如果你喜欢更紧凑的代码,Array.reduce()是个好选择。我们把第一个数组作为初始值,然后每一步都和当前数组取交集,最终得到所有数组的共有元素:
const arrays = [[1,2,3], [2,3,4], [2,4,5]]; const intersection = arrays.reduce((acc, curr) => { // 保留acc中同时存在于curr的元素 return acc.filter(item => curr.includes(item)); }, arrays[0]); console.log(intersection); // 输出 [2]
处理重复元素的小技巧
如果你的数组里存在重复元素,想要结果自动去重的话,可以在每一步过滤前先把当前交集转成Set去重:
const arrays = [[1,2,2,3], [2,3,4], [2,4,5]]; const intersection = arrays.reduce((acc, curr) => { return [...new Set(acc)].filter(item => curr.includes(item)); }, arrays[0]); console.log(intersection); // 输出 [2]
这些方法都很灵活,不管你是处理3个数组还是更多,都能轻松搞定~
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

