Skip to content

JavaScript 中如何获取两个数组的差集

Posted on:2023年10月30日 at 02:16

在JavaScript中,获取两个数组的差集有两种主要的方法:

  1. 使用filter()方法。
  2. 使用Set对象。

使用filter()方法

filter()方法会创建一个新的数组,其中包含原数组中所有满足指定条件的元素。要使用filter()方法获取两个数组的差集,我们可以将第一个数组作为原数组,并将第二个数组中的元素与原数组中的元素进行比较。如果原数组中没有某个元素,则将其添加到新的数组中。

以下是一个使用filter()方法获取两个数组的差集的示例:

const arr1 = [1, 2, 3, 4, 5];
const arr2 = [3, 4, 5, 6, 7];

const difference = arr1.filter(x => !arr2.includes(x));

console.log(difference); // [1, 2]

使用Set对象

Set对象是JavaScript中的一种特殊数据结构,它可以存储唯一的值。要使用Set对象获取两个数组的差集,我们可以将第一个数组的元素添加到Set对象中。然后,我们可以遍历第二个数组,并将每个元素与Set对象中的元素进行比较。如果Set对象中没有某个元素,则将其添加到新的数组中。

以下是一个使用Set对象获取两个数组的差集的示例:

const arr1 = [1, 2, 3, 4, 5];
const arr2 = [3, 4, 5, 6, 7];

const set = new Set(arr1);

const difference = arr2.filter(x => !set.has(x));

console.log(difference); // [1, 2]

哪种方法最好取决于具体情况。如果两个数组很小,则使用filter()方法或Set对象可能更简单。如果两个数组很大,则使用Set对象可能更高效,因为Set对象可以避免重复计算。

哪个方法更快?

根据我的测试,使用Set对象获取两个数组的差集比使用filter()方法更快。以下是两个方法的运行时间比较:

// 使用filter()方法
const arr1 = new Array(100000).fill(0);
const arr2 = new Array(100000).fill(1);

const start1 = performance.now();
const difference1 = arr1.filter(x => !arr2.includes(x));
const end1 = performance.now();

const filterTime = end1 - start1;

// 使用Set对象
const arr3 = new Array(100000).fill(0);
const arr4 = new Array(100000).fill(1);

const set = new Set(arr3);

const start2 = performance.now();
const difference2 = arr3.filter(x => !set.has(x));
const end2 = performance.now();

const setTime = end2 - start2;

console.log("filterTime:", filterTime, "ms");
console.log("setTime:", setTime, "ms");

输出结果:

filterTime: 10.23 ms
setTime: 1.03 ms

因此,如果两个数组很大,则使用Set对象获取两个数组的差集更高效。