如何获取两个数组的交集并保持第二个数组的元素顺序?
Got it!要解决「获取两个数组的交集且元素顺序与第二个数组一致」的问题,我们可以分两种场景来实现,同时覆盖各种边界情况:
基础场景:元素无重复
如果你的数组元素都是唯一的,用这个高效的方法就足够了:
function getOrderedIntersection(array1, array2) { // 把第一个数组转成Set,实现O(1)时间复杂度的查找 const elementsFromArray1 = new Set(array1); // 遍历第二个数组,只保留存在于Set中的元素 return array2.filter(item => elementsFromArray1.has(item)); } // 测试你的示例 const array1 = ['a', 'b', 'c']; const array2 = ['b', 'c', 'a', 'd']; console.log(getOrderedIntersection(array1, array2)); // 输出: ['b', 'c', 'a']
这个方法的优势在于:
- 严格遵循第二个数组的元素顺序
- 时间复杂度是O(n + m)(n是array1长度,m是array2长度),性能优异
- 自动过滤掉array2中不在array1里的元素
进阶场景:处理重复元素
如果你的数组存在重复元素,且需要保证交集里的元素出现次数不超过它在第一个数组中的次数(比如array1有2个'a',那交集里最多保留2个'a'),可以用计数映射的方式实现:
function getOrderedIntersectionWithDuplicates(array1, array2) { // 统计array1中每个元素的出现次数 const elementCount = {}; array1.forEach(item => { elementCount[item] = (elementCount[item] || 0) + 1; }); const result = []; array2.forEach(item => { // 只有当该元素还有剩余次数时,才加入结果并减少计数 if (elementCount[item] > 0) { result.push(item); elementCount[item]--; } }); return result; } // 测试重复元素场景 const array1WithDuplicates = ['a', 'a', 'b']; const array2WithDuplicates = ['a', 'b', 'a', 'c', 'a']; console.log(getOrderedIntersectionWithDuplicates(array1WithDuplicates, array2WithDuplicates)); // 输出: ['a', 'b', 'a'](只保留array1中存在的2个'a')
这个方法覆盖了更多边界情况,比如:
- array1或array2包含重复元素
- 避免交集元素出现次数超过原数组的情况
你可以根据自己的实际需求选择对应的方法,这两个实现都能稳定处理各种输入场景~
内容的提问来源于stack exchange,提问作者Skullomania
相关产品推荐
相关产品推荐

