Bootstrap

JavaScript - 数组操作(交集、并集、补集、差集)

目录

引言

1. 数组交集(Intersection)

2. 数组并集(Union)

3. 数组差集(Difference)

4. 数组补集(Complement)

5. 性能考虑:

示例代码整合


引言

  • 简要介绍数组在 JavaScript 中的重要性及其应用场景。
  • 说明数组操作(交集、并集、补集、差集)在数据处理、算法和集合运算中的重要性。
1. 数组交集(Intersection)
  • 定义

    • 数组的交集是指两个数组中共有的元素。
  • 实现方法

    • 使用 filter 和 includes 方法。
    • 使用 Set 进行高效查找。
  • 示例代码

function intersection(arr1, arr2) {
  return arr1.filter(value => arr2.includes(value));
}

const array1 = [1, 2, 3, 4];
const array2 = [3, 4, 5, 6];
console.log(intersection(array1, array2)); // 输出: [3, 4]
  • 通过 Set 实现:
function intersectionSet(arr1, arr2) {
  const set2 = new Set(arr2);
  return arr1.filter(value => set2.has(value));
}

console.log(intersectionSet(array1, array2)); // 输出: [3, 4]
2. 数组并集(Union)
  • 定义

    • 数组的并集是指两个数组中所有不同元素的集合。
  • 实现方法

    • 使用扩展运算符(...)、concat 方法和 Set 去重。
  • 示例代码

function union(arr1, arr2) {
  return [...new Set([...arr1, ...arr2])];
}

console.log(union(array1, array2)); // 输出: [1, 2, 3, 4, 5, 6]
3. 数组差集(Difference)
  • 定义

    • 数组的差集是指在第一个数组中有但在第二个数组中没有的元素。
  • 实现方法

    • 使用 filter 和 includes 方法。
    • 使用 Set 进行高效查找。
  • 示例代码

function difference(arr1, arr2) {
  return arr1.filter(value => !arr2.includes(value));
}

console.log(difference(array1, array2)); // 输出: [1, 2]
  • 通过 Set 实现:
function differenceSet(arr1, arr2) {
  const set2 = new Set(arr2);
  return arr1.filter(value => !set2.has(value));
}

console.log(differenceSet(array1, array2)); // 输出: [1, 2]
4. 数组补集(Complement)
  • 定义

    • 数组的补集是指在全集中有但在指定数组中没有的元素。其中,全集是指两个数组的并集。
  • 实现方法

    • 首先求并集,然后从并集中移除指定数组中的元素。
  • 示例代码

function complement(arr1, arr2) {
  const unionSet = union(arr1, arr2);
  const intersectionSet = intersection(arr1, arr2);
  return unionSet.filter(value => !intersectionSet.includes(value));
}

console.log(complement(array1, array2)); // 输出: [1, 2, 5, 6]
5. 性能考虑

  • 在大数据集上,使用 Set 或 Map 进行查找可以显著提高性能。
  • 避免不必要的循环和查找操作,以优化性能。

示例代码整合

为了方便读者理解,这里提供一个完整的示例代码,其中包含所有上述操作的实现:

// 交集
function intersection(arr1, arr2) {
  return arr1.filter(value => arr2.includes(value));
}

// 并集
function union(arr1, arr2) {
  return [...new Set([...arr1, ...arr2])];
}

// 差集
function difference(arr1, arr2) {
  return arr1.filter(value => !arr2.includes(value));
}

// 补集
function complement(arr1, arr2) {
  const unionSet = union(arr1, arr2);
  const intersectionSet = intersection(arr1, arr2);
  return unionSet.filter(value => !intersectionSet.includes(value));
}

const array1 = [1, 2, 3, 4];
const array2 = [3, 4, 5, 6];

console.log('交集:', intersection(array1, array2)); // 输出: [3, 4]
console.log('并集:', union(array1, array2)); // 输出: [1, 2, 3, 4, 5, 6]
console.log('差集:', difference(array1, array2)); // 输出: [1, 2]
console.log('补集:', complement(array1, array2)); // 输出: [1, 2, 5, 6]
;