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

如何实现JavaScript数组交集函数?排查代码结果不符问题

问题分析与修复方案

你的代码逻辑方向偏了,咱们先拆解下问题出在哪:

你的代码核心错误

  • 错误的判断逻辑:你把所有数组合并后,通过检查元素是否在合并数组中重复出现来判断是否是交集,但这完全不对——比如元素1在arr2和arr3里有,但arr1里没有,合并后它会出现两次,但它根本不属于所有数组的交集。
  • 数组遍历的致命bug:你在遍历concatArray的时候用了shift(),这会直接修改原数组的长度和元素位置,导致你的遍历索引i和实际数组元素完全不匹配,最后会把很多不该有的元素塞进结果里。

正确的思路实现

要实现多数组的交集,正确的逻辑应该是:

  1. 以第一个数组为基准(如果没有输入数组就返回空)
  2. 遍历基准数组的每个元素,检查这个元素是否存在于所有其他输入数组中
  3. 同时要注意去重,避免基准数组里的重复元素导致结果重复

下面是修复后的代码:

function intersection(...arrays) {
  // 如果没有输入数组,直接返回空
  if (arrays.length === 0) return [];
  // 以第一个数组为基准,先去重避免重复检查
  const baseArray = [...new Set(arrays[0])];
  // 筛选出在所有其他数组里都存在的元素
  return baseArray.filter(element => {
    return arrays.every(arr => arr.includes(element));
  });
}

const arr1 = [5, 10, 15, 20];
const arr2 = [15, 88, 1, 5, 7];
const arr3 = [1, 10, 15, 5, 20];
console.log(intersection(arr1, arr2, arr3)); // 输出: [5, 15]

代码解释

  • 用...arrays剩余参数接收所有输入数组,调用的时候可以直接传intersection(arr1, arr2, arr3),比传数组的写法更直观
  • 先对基准数组去重,避免重复检查同一个元素
  • 用every()方法确保当前元素在所有输入数组中都存在,这才是交集的核心定义
  • 最后用filter()筛选出符合条件的元素,得到最终交集

如果你坚持要保持原函数的调用方式(传一个包含多个数组的数组),那只需要把函数参数改成arrays,调用时传[arr1, arr2, arr3]即可,核心逻辑不变:

function intersection(arrays) {
  if (arrays.length === 0) return [];
  const baseArray = [...new Set(arrays[0])];
  return baseArray.filter(element => {
    return arrays.every(arr => arr.includes(element));
  });
}

console.log(intersection([arr1, arr2, arr3])); // 同样输出: [5, 15]

内容的提问来源于stack exchange,提问作者PineNuts0

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:07:14