如何使用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 中的唯一元素集合,同时避免因引用混淆或重复添加导致的问题。

相关文章
|
1月前
|
存储 安全
for...of循环在遍历Set时,如何正确添加元素?
for...of循环在遍历Set时,如何正确添加元素?
137 59
|
1月前
|
存储 安全 JavaScript
如何使用Set的delete()方法删除元素?
如何使用Set的delete()方法删除元素?
122 10
|
1月前
|
存储 JavaScript 前端开发
Set中的add()方法和数组的push()方法有什么区别?
Set中的add()方法和数组的push()方法有什么区别?
59 1
|
4月前
|
Web App开发 存储 前端开发
别再用双层遍历循环来做新旧数组对比,寻找新增元素了!使用array.includes和Set来提升代码可读性
这类问题的重点在于能不能突破基础思路,突破基础思路是从程序员入门变成中级甚至高级的第一步,如果所有需求都通过最基础的业务逻辑来做,是得不到成长的。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
7月前
|
Java Maven Spring
【SpringBug】lombok插件失效,但是没有报错信息,@Data不能生成get和set方法
解决写了@Data注解,但是在测试文件中生成的反编译target文件Us二Info中没有get和set方法
588 16
|
8月前
|
Java Windows
IDEA不使用lombok,如何快速生成get和set方法
【11月更文挑战第10天】在 IntelliJ IDEA 中生成 `get` 和 `set` 方法有多种方式:通过菜单操作、使用快捷键或自定义模板。菜单操作包括选择“Code”菜单中的“Generate...”,快捷键为“Alt + Insert”。自定义模板可在“File”->“Settings”->“Editor”->“Code Style”->“Java”中设置。批量生成时,可多选变量一次性生成。
1138 2
|
4月前
|
编译器 C++ 容器
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
110 2
|
1月前
|
存储 JavaScript 前端开发
for...of循环在遍历Set和Map时的注意事项有哪些?
for...of循环在遍历Set和Map时的注意事项有哪些?
48 0
|
1月前
|
存储 C++ 容器
unordered_set、unordered_multiset、unordered_map、unordered_multimap的介绍及使用
unordered_set是不按特定顺序存储键值的关联式容器,其允许通过键值快速的索引到对应的元素。在unordered_set中,元素的值同时也是唯一地标识它的key。在内部,unordered_set中的元素没有按照任何特定的顺序排序,为了能在常数范围内找到指定的key,unordered_set将相同哈希值的键值放在相同的桶中。unordered_set容器通过key访问单个元素要比set快,但它通常在遍历元素子集的范围迭代方面效率较低。它的迭代器至少是前向迭代器。前向迭代器的特性。
64 0
|
1月前
|
编译器 C++ 容器
用一棵红黑树同时封装出map和set
再完成上面的代码后,我们的底层代码已经完成了,这时候已经是一个底层STL的红黑树了,已经已符合库里面的要求了,这时候我们是需要给他穿上对应的“衣服”,比如穿上set的“衣服”,那么这个穿上set的“衣服”,那么他就符合库里面set的要求了,同样map一样,这时候我们就需要实现set与map了。因此,上层容器map需要向底层红黑树提供一个仿函数,用于获取T当中的键值Key,这样一来,当底层红黑树当中需要比较两个结点的键值时,就可以通过这个仿函数来获取T当中的键值了。我们就可以使用仿函数了。
28 0