javascript的set交集需手动实现,常用filter+has或for...of遍历,可封装为支持多集合的工具函数,结果为新set且遵循samevaluezero比较规则。

JavaScript 的 Set 本身不提供直接的交集方法,但可以用简洁、高效的方式手动实现数学上的交集(即两个集合中**共同存在的元素**)。
用 filter + has 实现交集
这是最常用、可读性好且性能不错的方法。核心思路是:遍历一个 Set,保留那些在另一个 Set 中也存在的元素。
- 把其中一个 Set 转成数组,用
filter()筛选 - 用另一个 Set 的
has()方法判断是否存在 - 最后用筛选结果新建一个 Set,保证结果仍是 Set 类型
示例:
const a = new Set([1, 2, 3, 4]);const b = new Set([3, 4, 5, 6]);
const intersection = new Set([...a].filter(x => b.has(x)));
console.log(intersection); // Set { 3, 4 }
用 for...of 遍历更直观
适合对性能有轻微要求或希望逻辑更清晰的场景。避免创建中间数组(相比展开运算符),尤其在大数据量时略优。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 初始化一个空 Set 存结果
- 遍历第一个 Set,逐个检查是否在第二个 Set 中存在
- 存在就 add 进结果 Set
示例:
const a = new Set([1, 2, 3, 4]);const b = new Set([3, 4, 5, 6]);
const intersection = new Set();
for (const x of a) {
if (b.has(x)) intersection.add(x);
}
console.log(intersection); // Set { 3, 4 }
封装成可复用的工具函数
交集操作常被多次使用,建议封装为函数,支持任意多个 Set(扩展性强)。
- 以第一个 Set 为基准,逐个与其他 Set 求交
- 每次迭代都更新当前交集结果,用
filter或for...of都可以 - 注意边界:空参数、单个 Set、无交集等情况
简易多集合交集函数:
function intersect(...sets) {if (sets.length === 0) return new Set();
if (sets.length === 1) return new Set(sets[0]);
let result = new Set(sets[0]);
for (let i = 1; i const current = sets[i];
result = new Set([...result].filter(x => current.has(x))));
}
return result;
}
// 使用:
intersect(new Set([1,2,3]), new Set([2,3,4]), new Set([3,4,5])); // Set { 3 }
注意事项和常见误区
交集是数学概念,JS 的 Set 交集需注意类型与值的一致性:
- Set 中元素按 SameValueZero 规则比较(
0和-0被视为相等,NaN和NaN也被视为相等) - 对象引用不同即视为不同元素,即使内容一样:
new Set([{a:1}]).size === 1,不会自动深比较 - 交集结果一定是新 Set,原 Set 不会被修改
- 不支持字符串、数组等非 Set 类型直接参与;需先转成 Set(如
new Set(arr))
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










