You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取两个数组的交集并保持第二个数组的元素顺序?

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:52:58