文章目录

JavaScript Set的交集、并集、差集运算方法

发布于 2026-04-20 01:20:01 · 浏览 5 次 · 评论 0 条

JavaScript Set的交集、并集、差集运算方法

JavaScript 原生的 Set 对象虽然提供了存储唯一值的强大能力,但并没有像 Python 或数学集合那样直接内置 union(并集)、intersection(交集)或 difference(差集)的方法。我们需要利用 ES6 的扩展运算符和数组方法来手动实现这些功能。


并集运算

并集是指将两个集合中的所有元素合并在一起,重复的元素只保留一个。数学表达式为 $A \cup B$。

  1. 定义两个 Set 对象,分别名为 setAsetB,并填入初始数据。
  2. 使用扩展运算符 ... 将两个 Set 中的元素展开到一个数组字面量中。
  3. 这个合并后的数组作为参数传递给 new Set() 构造函数。
  4. 利用 Set 的特性自动去除重复元素,生成最终的并集。
const setA = new Set([1, 2, 3, 4]);
const setB = new Set([3, 4, 5, 6]);

// 计算并集
const union = new Set([...setA, ...setB]);

console.log(union); // 输出: Set {1, 2, 3, 4, 5, 6}

交集运算

交集是指提取两个集合中共同存在的元素。数学表达式为 $A \cap B$。

  1. 定义两个 Set 对象 setAsetB
  2. setA 转换为数组,以便使用数组的 filter 方法,操作为 [...setA]
  3. 调用 .filter() 方法,传入一个回调函数。
  4. 回调函数中,使用 setB.has(x) 检查 setA 中的当前元素 x 是否也存在于 setB 中。
  5. 过滤后的结果数组传回 new Set(),得到最终的交集。
const setA = new Set([1, 2, 3, 4]);
const setB = new Set([3, 4, 5, 6]);

// 计算交集
const intersection = new Set([...setA].filter(x => setB.has(x)));

console.log(intersection); // 输出: Set {3, 4}

差集运算

差集是指提取存在于集合 A 但不存在于集合 B 中的元素。数学表达式为 $A - B$。注意,差集运算具有方向性,$A - B$ 通常不等于 $B - A$。

  1. 定义两个 Set 对象 setA(被减集)和 setB(减集)。
  2. 展开 setA 为数组形式 [...setA]
  3. 调用 .filter() 方法筛选元素。
  4. 设置筛选条件为 x => !setB.has(x),即保留那些setB 中的元素。
  5. 构建新的 Set 对象来存储差集结果。
const setA = new Set([1, 2, 3, 4]);
const setB = new Set([3, 4, 5, 6]);

// 计算 setA 对 setB 的差集 (A - B)
const difference = new Set([...setA].filter(x => !setB.has(x)));

console.log(difference); // 输出: Set {1, 2}

封装为工具函数

为了在项目中复用这些逻辑,可以将它们封装成通用的工具函数。

  1. 创建一个名为 setUtils 的对象或单独的函数文件。
  2. 实现 union 函数,接收两个 Set 参数,返回合并后的新 Set。
  3. 实现 intersection 函数,接收两个 Set 参数,返回包含共同元素的新 Set。
  4. 实现 difference 函数,接收两个 Set 参数,返回包含差异元素的新 Set。
const setUtils = {
  // 并集
  union: (setA, setB) => {
    return new Set([...setA, ...setB]);
  },

  // 交集
  intersection: (setA, setB) => {
    return new Set([...setA].filter(x => setB.has(x)));
  },

  // 差集 (A - B)
  difference: (setA, setB) => {
    return new Set([...setA].filter(x => !setB.has(x)));
  }
};

// 使用示例
const a = new Set([1, 2, 3]);
const b = new Set([2, 3, 4]);

console.log(setUtils.difference(a, b)); // 输出: Set {1}

性能提示

上述方法使用了扩展运算符 [...set] 将 Set 转换为数组,这通常适用于数据量较小的场景(例如几千个元素以内)。

  1. 注意对于超大型的 Set(例如包含数十万元素),频繁地进行数组转换和 filter 遍历可能会导致性能瓶颈。
  2. 考虑在处理极大数据集时,手动使用 for...of 循环遍历一个 Set 并使用 .add() 方法逐个操作另一个 Set,这样可以避免生成中间数组,从而节省内存开销。

评论 (0)

暂无评论,快来抢沙发吧!

扫一扫,手机查看

扫描上方二维码,在手机上查看本文