方法1:使用 some()
+ includes()
(适合小数组)
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
(适合大数组,性能更优)
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()
(直接获取交集元素)
function getCommonElements(arr1, arr2) {return arr1.filter(item => arr2.includes(item));
}// 检查是否有交集
const common = getCommonElements([1, 2], [2, 3]);
console.log(common.length > 0); // true
注意事项:
对象/引用类型:以上方法只适用于基本类型(数字、字符串等)。对象比较的是引用地址:
const obj1 = { id: 1 }; const obj2 = { id: 1 }; const arr1 = [obj1]; const arr2 = [obj2];// 错误:比较的是引用地址而非内容 console.log(haveCommonElements(arr1, arr2)); // false
需使用
JSON.stringify()
或深度比较(如Lodash的_.isEqual()
)处理对象。性能考虑:
小数组(<1000元素):
includes()
可满足需求大数组:使用
Set
(Set.has()
的时间复杂度为 O(1))
完整解决方案(支持基本类型):
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
处理对象数组的扩展方案:
// 使用 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 避免阻塞