在JavaScript中,比较两个数组是否有相同元素(交集)的常用方法

方法1:使用 some() + includes()(适合小数组)

javascript 复制代码
function haveCommonElements(arr1, arr2) {
  return arr1.some(item => arr2.includes(item));
}

// 使用示例
const arrA = [1, 2, 3];
const arrB = [3, 4, 5];
console.log(haveCommonElements(arrA, arrB)); // true

方法2:使用 Set(适合大数组,性能更优)

javascript 复制代码
function haveCommonElements(arr1, arr2) {
  const set = new Set(arr2);
  return arr1.some(item => set.has(item));
}

// 使用示例
const arrC = ['apple', 'banana'];
const arrD = ['orange', 'banana', 'grape'];
console.log(haveCommonElements(arrC, arrD)); // true

方法3:使用 filter() + includes()(直接获取交集元素)

javascript 复制代码
function getCommonElements(arr1, arr2) {
  return arr1.filter(item => arr2.includes(item));
}

// 检查是否有交集
const common = getCommonElements([1, 2], [2, 3]);
console.log(common.length > 0); // true

注意事项:

  1. 对象/引用类型:以上方法只适用于基本类型(数字、字符串等)。对象比较的是引用地址:

    javascript 复制代码
    const obj1 = { id: 1 };
    const obj2 = { id: 1 };
    const arr1 = [obj1];
    const arr2 = [obj2];
    
    // 错误:比较的是引用地址而非内容
    console.log(haveCommonElements(arr1, arr2)); // false

    需使用JSON.stringify()或深度比较(如Lodash的_.isEqual())处理对象。

  2. 性能考虑

    • 小数组(<1000元素):includes() 可满足需求

    • 大数组:使用 SetSet.has() 的时间复杂度为 O(1))

完整解决方案(支持基本类型):

javascript 复制代码
function haveCommonElements(arr1, arr2) {
  // 使用 Set 优化性能
  const set = new Set(arr2);
  return arr1.some(item => set.has(item));
}

// 测试用例
console.log(haveCommonElements([1, 2], [3, 4]));     // false
console.log(haveCommonElements(['a', 'b'], ['b']));  // true
console.log(haveCommonElements([], []));             // false

处理对象数组的扩展方案:

javascript 复制代码
// 使用 Lodash 的深比较
import _ from 'lodash';

function haveCommonObjects(arr1, arr2) {
  return arr1.some(item1 => 
    arr2.some(item2 => _.isEqual(item1, item2))
  );
}

// 或使用 JSON.stringify(注意:属性顺序需一致)
function haveCommonObjects(arr1, arr2) {
  const set = new Set(arr2.map(item => JSON.stringify(item)));
  return arr1.some(item => set.has(JSON.stringify(item)));
}

根据需求选择合适的方法:

  • 基本类型 :推荐 Set 方案(高效简洁)

  • 对象类型:使用 Lodash 等库的深度比较函数

  • 超大型数组:考虑分块处理或 Web Worker 避免阻塞