set.add()和set.has()手动去重适合需条件判断、边遍历边过滤或自定义唯一性(如对象按属性去重)的场景,核心是“先has()检查再add()添加”,时间复杂度o(n),比一次性new set更灵活可控。

用 Set.add() 和 Set.has() 手动控制去重,适合需要条件判断、边遍历边过滤、或处理复杂逻辑(比如对象去重、自定义唯一性)的场景。它比直接用 new Set(arr) 更灵活,但核心原理一致:利用 Set 元素天然不重复的特性。
add() 和 has() 配合实现逐项去重
关键在于先用 has() 检查是否已存在,只在不存在时才调用 add()。这样能避免无效添加,也便于插入前做额外处理(如转换、校验)。
-
set.has(value)返回布尔值,判断元素是否已在集合中 -
set.add(value)只有该值尚未存在时才真正添加,并返回 Set 本身(支持链式调用) - 两者组合可精确控制“什么情况下才加入”
常见使用模式:遍历数组 + 条件添加
例如对数字数组去重,同时跳过负数:
const arr = [1, -2, 2, 1, 3, -2, 4];
const uniqueSet = new Set();
for (const item of arr) {
if (item >= 0 && !uniqueSet.has(item)) {
uniqueSet.add(item);
}
}
console.log(Array.from(uniqueSet)); // [1, 2, 3, 4]
这个过程清晰体现了“先查后加”的逻辑,比一次性构造 Set 更可控。
处理对象时的注意事项
Set 对象去重基于引用相等(===),不是内容比较。所以两个结构相同但内存地址不同的对象,会被视为不同元素:
-
new Set([{a:1}, {a:1}])包含两个对象 - 若需按属性去重,得先提取唯一标识(如 ID 字符串),再用
has()判断该 ID 是否存在 - 例如:
if (!idSet.has(obj.id)) { idSet.add(obj.id); uniqueArr.push(obj); }
性能与适用边界
单独调用 has() 和 add() 的时间复杂度都是 O(1),整体遍历是 O(n),效率很高。但它更适合以下情况:
- 去重逻辑不能简单“全量转 Set”,而要结合业务条件(如过滤、映射、异步判断)
- 需要在去重过程中同步收集其他信息(如首次出现索引、统计次数)
- 数据流式到达(如事件监听、分页加载),无法一次性获取全部原始数组
纯静态数组去重,[...new Set(arr)] 或 Array.from(new Set(arr)) 仍是更简洁高效的选择。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











