2026-06-02 02:05:52
JavaScript实现数组差集(从一个数组中剔除另一个数组中存在的元素)的方法多样,以下是具体实现方案及适用场景分析:
1. 基础方法:循环遍历 + Set优化原理:通过Set提高查找效率,遍历第一个数组并筛选出不在第二个数组中的元素。
function difference(arr1, arr2) { const set2 = new Set(arr2); // 用Set存储arr2元素 const result = []; for (const element of arr1) { if (!set2.has(element)) { result.push(element); } } return result;}// 示例const arr1 = [1, 2, 3, 4, 5];const arr2 = [3, 5, 6];console.log(difference(arr1, arr2)); // 输出: [1, 2, 4]特点:
原理:利用filter遍历第一个数组,结合includes判断元素是否存在于第二个数组中。
function difference(arr1, arr2) { return arr1.filter(element => !arr2.includes(element));}// 示例const arr1 = [1, 2, 3, 4, 5];const arr2 = [3, 5, 6];console.log(difference(arr1, arr2)); // 输出: [1, 2, 4]特点:
原理:通过自定义比较函数(如比较对象属性)实现对象数组的差集。
function differenceBy(arr1, arr2, compareFn) { return arr1.filter(item1 => !arr2.some(item2 => compareFn(item1, item2)));}// 示例:比较对象的id属性const arr1 = [{ id: 1, name: 'a' }, { id: 2, name: 'b' }, { id: 3, name: 'c' }];const arr2 = [{ id: 2, name: 'b' }, { id: 4, name: 'd' }];const diff = differenceBy(arr1, arr2, (obj1, obj2) => obj1.id === obj2.id);console.log(diff); // 输出: [{ id: 1, name: 'a' }, { id: 3, name: 'c' }]特点:
原理:将第二个数组的元素存入哈希表(对象),通过快速查找实现差集。
function differenceWithHash(arr1, arr2) { const hash = {}; const result = []; for (const element of arr2) { hash[element] = true; // 标记元素存在 } for (const element of arr1) { if (!hash[element]) { result.push(element); } } return result;}// 示例const arr1 = [1, 2, 3, 4, 5];const arr2 = [3, 5, 6];console.log(differenceWithHash(arr1, arr2)); // 输出: [1, 2, 4]特点:
需求:根据是否保留重复元素选择不同策略。
若项目已引入Lodash,可直接使用其优化过的difference方法:
const _ = require('lodash');const arr1 = [1, 2, 3, 4, 5];const arr2 = [3, 5, 6];console.log(_.difference(arr1, arr2)); // 输出: [1, 2, 4]特点:底层优化,适合复杂场景或大型项目。
总结:方法选择建议
最终选择需权衡数据类型、规模及性能要求,无绝对最优解,只有最合适方案。