如何使用Set的add()方法添加元素?

简介: 如何使用Set的add()方法添加元素?

在 JavaScript 中,Set 对象的 add() 方法用于向集合中添加新元素。以下是关于如何正确使用 add() 方法的详细指南:

一、基本语法与参数

set.add(value);
  • 参数value 是要添加到 Set 中的元素值,可以是任意类型。
  • 返回值:返回 Set 对象本身,因此可以链式调用多个 add() 方法。
  • 特性
    • 唯一性:Set 中的元素不可重复,若添加已存在的值,Set 不会发生变化。
    • 顺序性:元素按添加顺序排列,遍历时保持此顺序。

二、添加基本类型元素

const set = new Set();

// 添加单个元素
set.add(1);
set.add("hello");
set.add(true);

// 链式添加多个元素
set.add(2).add("world").add(null);

console.log([...set]); // [1, "hello", true, 2, "world", null]

// 添加重复元素(无效操作)
set.add(1);
console.log([...set]); // 仍为 [1, "hello", true, 2, "world", null]

三、添加对象或数组元素

由于 Set 基于引用相等性判断元素是否重复,即使对象内容相同,不同引用也会被视为不同元素:

const set = new Set();

// 添加对象
const obj1 = {
    id: 1 };
const obj2 = {
    id: 1 }; // 内容相同,但引用不同

set.add(obj1);
set.add(obj2);

console.log([...set]); // [ { id: 1 }, { id: 1 } ](两个不同对象)

// 添加相同引用的对象(无效操作)
set.add(obj1);
console.log([...set]); // 仍为 [ { id: 1 }, { id: 1 } ]

四、添加特殊值

Set 能正确处理特殊值(如 NaNundefined):

const set = new Set();

set.add(NaN);
set.add(undefined);

console.log([...set]); // [NaN, undefined]

// 注意:NaN 与自身的严格比较(NaN === NaN)为 false,但 Set 视其为重复值
set.add(NaN);
console.log([...set]); // 仍为 [NaN, undefined]

五、批量添加元素的方法

1. 通过数组初始化 Set

const array = [1, 2, 3, 4];
const set = new Set(array); // 直接将数组元素添加到 Set

console.log([...set]); // [1, 2, 3, 4]

2. 遍历添加多个元素

const set = new Set();
const values = [1, 2, "a", "b"];

values.forEach(value => set.add(value));
console.log([...set]); // [1, 2, "a", "b"]

六、常见错误与注意事项

  1. 区分值类型与引用类型

    • 添加对象时,确保引用相同才会被视为重复元素。
      const obj = {
              key: "value" };
      const set = new Set([obj]);
      set.add({
              key: "value" }); // 新对象,引用不同,添加成功
      console.log([...set]); // [ { key: "value" }, { key: "value" } ]
      
  2. 链式调用的返回值
    add() 返回 Set 本身,可用于连续添加:

    set.add(1).add(2).add(3);
    
  3. 添加元素的顺序性
    Set 遍历时按元素添加顺序返回,可利用此特性维护有序集合:

    const set = new Set();
    set.add(3).add(1).add(2);
    console.log([...set]); // [3, 1, 2](保持添加顺序)
    

七、应用场景示例

1. 数组去重

const arrayWithDuplicates = [1, 2, 2, 3, 3, 3];
const uniqueArray = [...new Set(arrayWithDuplicates)];

console.log(uniqueArray); // [1, 2, 3]

2. 维护黑名单/白名单

const blockedUsers = new Set();

// 添加黑名单用户
blockedUsers.add("spammer1").add("spammer2");

// 检查用户是否在黑名单中
console.log(blockedUsers.has("spammer1")); // true

3. 合并多个数组的唯一元素

const arr1 = [1, 2, 3];
const arr2 = [3, 4, 5];
const mergedUnique = [...new Set([...arr1, ...arr2])];

console.log(mergedUnique); // [1, 2, 3, 4, 5]

八、总结:安全添加元素的最佳实践

  1. 利用唯一性特性
    若需确保集合中元素不重复,直接使用 add() 即可自动过滤重复值。

  2. 处理对象元素

    • 若需按内容而非引用判断重复,可先通过其他方式(如 JSON.stringify())转换为字符串,再添加到 Set。
    • 或使用 Map 存储对象与标识的映射关系。
  3. 批量操作
    优先通过数组初始化 Set 或遍历添加,避免逐个手动调用 add()

通过合理使用 add() 方法,可高效管理 Set 中的唯一元素集合,同时避免因引用混淆或重复添加导致的问题。

相关文章
|
5月前
|
存储 JavaScript 前端开发
Set中的add()方法和数组的push()方法有什么区别?
Set中的add()方法和数组的push()方法有什么区别?
377 122
|
5月前
|
存储 安全 JavaScript
如何使用Set的delete()方法删除元素?
如何使用Set的delete()方法删除元素?
512 122
|
5月前
|
存储 安全
for...of循环在遍历Set时,如何正确添加元素?
for...of循环在遍历Set时,如何正确添加元素?
241 59
|
4月前
|
JavaScript 前端开发
如何使用Set的delete()方法删除Set中的所有元素?
如何使用Set的delete()方法删除Set中的所有元素?
319 1
|
8月前
|
Web App开发 存储 前端开发
别再用双层遍历循环来做新旧数组对比,寻找新增元素了!使用array.includes和Set来提升代码可读性
这类问题的重点在于能不能突破基础思路,突破基础思路是从程序员入门变成中级甚至高级的第一步,如果所有需求都通过最基础的业务逻辑来做,是得不到成长的。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
11月前
|
Java Maven Spring
【SpringBug】lombok插件失效,但是没有报错信息,@Data不能生成get和set方法
解决写了@Data注解,但是在测试文件中生成的反编译target文件Us二Info中没有get和set方法
942 16
|
1月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
163 1
|
4月前
|
存储 缓存 JavaScript
Set和Map有什么区别?
Set和Map有什么区别?
395 1
|
1月前
|
存储 算法 容器
set_map的实现+set/map加持秒杀高频算法题锻炼算法思维
`set`基于红黑树实现,支持有序存储、自动去重,增删查效率为O(logN)。通过仿函数可自定义排序规则,配合空间配置器灵活管理内存。不支持修改元素值,迭代器失效需注意。`multiset`允许重复元素。常用于去重、排序及查找场景。
|
5月前
|
存储 JavaScript 前端开发
for...of循环在遍历Set和Map时的注意事项有哪些?
for...of循环在遍历Set和Map时的注意事项有哪些?
314 121