JavaScript Set的交集、并集、差集运算方法
JavaScript 原生的 Set 对象虽然提供了存储唯一值的强大能力,但并没有像 Python 或数学集合那样直接内置 union(并集)、intersection(交集)或 difference(差集)的方法。我们需要利用 ES6 的扩展运算符和数组方法来手动实现这些功能。
并集运算
并集是指将两个集合中的所有元素合并在一起,重复的元素只保留一个。数学表达式为 $A \cup B$。
- 定义两个 Set 对象,分别名为
setA和setB,并填入初始数据。 - 使用扩展运算符
...将两个 Set 中的元素展开到一个数组字面量中。 - 将这个合并后的数组作为参数传递给
new Set()构造函数。 - 利用 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$。
- 定义两个 Set 对象
setA和setB。 - 将
setA转换为数组,以便使用数组的filter方法,操作为[...setA]。 - 调用
.filter()方法,传入一个回调函数。 - 在回调函数中,使用
setB.has(x)检查setA中的当前元素x是否也存在于setB中。 - 将过滤后的结果数组传回
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$。
- 定义两个 Set 对象
setA(被减集)和setB(减集)。 - 展开
setA为数组形式[...setA]。 - 调用
.filter()方法筛选元素。 - 设置筛选条件为
x => !setB.has(x),即保留那些不在setB中的元素。 - 构建新的 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}
封装为工具函数
为了在项目中复用这些逻辑,可以将它们封装成通用的工具函数。
- 创建一个名为
setUtils的对象或单独的函数文件。 - 实现
union函数,接收两个 Set 参数,返回合并后的新 Set。 - 实现
intersection函数,接收两个 Set 参数,返回包含共同元素的新 Set。 - 实现
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 转换为数组,这通常适用于数据量较小的场景(例如几千个元素以内)。
- 注意对于超大型的 Set(例如包含数十万元素),频繁地进行数组转换和
filter遍历可能会导致性能瓶颈。 - 考虑在处理极大数据集时,手动使用
for...of循环遍历一个 Set 并使用.add()方法逐个操作另一个 Set,这样可以避免生成中间数组,从而节省内存开销。

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