JavaScript Set基础与实战应用

news2024/10/1 23:28:34

在JavaScript中,Set是一种非常有用的数据结构,它提供了一种存储唯一值的方式。与数组不同,Set中的每个值都是唯一的,这意味着集合中不会有重复的元素。本文将详细介绍Set的基本用法、特性以及高级操作,帮助你全面掌握这一数据结构。

一、Set的基本用法

1. 创建Set

你可以使用Set构造函数来创建一个新的Set实例。Set可以接受一个数组(或其他可迭代对象)作为参数来初始化集合。

// 创建一个空的Set
const mySet = new Set();

// 创建一个包含初始元素的Set
const initialSet = new Set([1, 2, 3, 4, 5]);

// 使用数组来创建Set,同时去除重复元素
const duplicatesArray = [2, 3, 4, 4, 5, 5];
const uniqueSet = new Set(duplicatesArray); // 此时 uniqueSet 为 {2, 3, 4, 5}

2. 添加元素

使用add()方法可以向Set中添加新的元素。如果添加的元素已经存在,则不会重复添加。

mySet.add(1);
mySet.add(2);
mySet.add(3);

3. 删除元素

使用delete()方法可以从Set中删除指定的元素。如果删除成功,则返回true;否则返回false

mySet.delete(2); // 从Set中删除元素2

4. 检查元素

使用has()方法可以检查Set中是否包含某个元素。如果包含,则返回true;否则返回false

mySet.has(1); // 检查Set中是否存在元素1,返回结果为 true

5. 清空Set

使用clear()方法可以清空Set中的所有元素。

mySet.clear(); // 清空Set

6. 获取Set的大小

使用size属性可以获取Set中元素的数量。

let sizedSet = new Set([1, 2, 3, 4, 5]);
console.log(sizedSet.size); // 输出: 5

二、Set的特性

1. 唯一性

Set中的元素是唯一的,这意味着不会有重复的元素。这是Set与数组最显著的区别之一。

const mySet = new Set([1, 2, 2, 3, 4, 4, 5]);
console.log(mySet); // 输出: Set { 1, 2, 3, 4, 5 }

2. 无序性

Set中的元素是无序的,这意味着你不能通过索引来访问元素。元素的排列顺序不是按照插入的顺序来决定的。

const unorderedSet = new Set();
unorderedSet.add(3);
unorderedSet.add(1);
unorderedSet.add(2);
console.log(unorderedSet); // 输出: Set { 3, 1, 2 }

3. 可迭代性

Set是可迭代的,你可以使用for...of循环、forEach方法或解构赋值来遍历Set中的元素。

// 使用for...of循环遍历Set
for (let item of mySet) {
    console.log(item);
}

// 使用forEach方法遍历Set
mySet.forEach(value => {
    console.log(value);
});

// 使用解构赋值将Set转换为数组
const arr = [...mySet];

三、Set的高级操作

1. 集合运算

虽然Set本身没有直接提供并集、差集和交集等集合运算的方法,但你可以通过一些简单的操作来实现这些功能。

并集

并集是指两个集合中所有不重复元素的集合。

function union(setA, setB) {
    return new Set([...setA, ...setB]);
}

const setA = new Set([1, 2, 3]);
const setB = new Set([3, 4, 5]);
const unionSet = union(setA, setB);
console.log(unionSet); // 输出: Set { 1, 2, 3, 4, 5 }
差集

差集是指在一个集合中存在,但在另一个集合中不存在的元素的集合。

function difference(setA, setB) {
    return new Set([...setA].filter(x => !setB.has(x)));
}

const differenceSetA = difference(setA, setB);
console.log(differenceSetA); // 输出: Set { 1, 2 }
交集

交集是指两个集合中都存在的元素的集合。

function intersection(setA, setB) {
    return new Set([...setA].filter(x => setB.has(x)));
}

const intersectionSet = intersection(setA, setB);
console.log(intersectionSet); // 输出: Set { 3 }

2. 类型和值的比较

Set中,值的比较是基于“Same-value-zero equality”算法的,这与严格相等(===)非常相似,但有一些区别。例如,NaNSet中被视为相等。

const mySet = new Set();
mySet.add(NaN);
mySet.add(NaN);
console.log(mySet.size); // 输出: 1

3. 与数组的转换

你可以轻松地将Set转换为数组,或者将数组转换为Set以去除重复元素。

// Set转换为数组
const arr = Array.from(mySet);

// 数组转换为Set
const myArray = [1, 2, 3, 4, 4, 5];
const mySetFromArray = new Set(myArray);

四、总结

Set是JavaScript中一个非常有用的数据结构,它提供了一种存储唯一值的方式。通过掌握Set的基本用法、特性以及高级操作,你可以在开发过程中更加灵活地处理集合数据。无论是去除数组中的重复元素,还是进行集合运算,Set都能提供简洁而高效的解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2183372.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年录屏软件排行榜:班迪录屏等四款软件实测!

不论是学习、娱乐还是工作,都有可能需要用到屏幕录制功能。在这篇文章中,我们将从不同的使用场景出发,为大家推荐几款实用的录屏工具——福昕录屏大师、转转大师录屏、爱拍录屏以及班迪录屏。 Foxit REC 直达链接(复制到浏览器打…

Flexible组件的用法

文章目录 1. 概念介绍2. 使用方法3. 示例代码我们在上一章回中介绍了扩展内容相关的知识,本章回中将介绍Flexible组件.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在前面章回中介绍了扩展列表相关的内容,当页面中其它组件和扩展列表一起使用时,扩展列表有可能会…

SpringBoot——基础配置

但是还需要删除pom.xml中的标签——模板的文件也同样操作 banner的选项——关闭 控制台 日志 banner图片的位置——还会分辨颜色 在 Java 的日志框架(如 Logback、Log4j2 等)中,logging.level.root主要用于设置根日志记录器的日志级别…

【Redis】如何在 Ubuntu 上安装 Redis 5

🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 本期内容主要介绍如何在 Ubuntu 上安装 Redis5 一些碎碎念: 本来这期内容介绍如何在 Centos 安装 Redis …

常用的Java安全框架

Spring Security: 就像Java安全领域的“瑞士军刀”,功能全面且强大。 支持认证、授权、加密、会话管理等安全功能。 与Spring框架无缝集成,使用起来特别方便。 社区活跃,文档丰富,遇到问题容易找到解决方案。 Apach…

SigmaStudio控件Cross Mixer\Signal Merger算法效果分析

衰减与叠加混音算法验证分析一 CH2:输入源为-20dB正弦波1khz CH1叠加混音:参考混音算法https://blog.csdn.net/weixin_48408892/article/details/129878036?spm1001.2014.3001.5502 Ch0衰减混音:外部多个输入源做混音时,建议参考该算法控件&…

网络通信——OSPF协议(基础篇)

这里基础是因为没有讲解OSPF中的具体算法过程,以及其中很多小细节。后续会更新。 目录 一.OSPF的基础信息 二.认识OSPF中的Router ID 三.OSPF中的三张表 四.OSPF中的度量方法(计算开销值) 五. OSPF选举DR和BDR(就是这个区域…

简单vue指令实现 el-table 可拖拽表格功能

安装 SortableJS sorttableJs 相关优点如下: 相关配置项 参考 👉 SortableJS中文官网 pnpm i sortablejs封装成指令 不多逼逼,直接上才艺 🤪🤪🤪 先安装一个 nanoid 插件 用于生成随机id,注…

图神经网络:处理复杂关系结构与图分类任务的强大工具

创作不易,您的打赏、关注、点赞、收藏和转发是我坚持下去的动力! 图神经网络(Graph Neural Network, GNN)是针对图数据的一类神经网络模型。图数据具有节点(节点代表实体)和边(边代表节点之间的…

LeetCode[中等] 55.跳跃游戏

给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 思路 贪心算法 可达位置…

html5 + css3(下)

目录 CSS基础体验cssCSS引入方式选择器选择器-标签选择器-类选择器-id选择器-通配符 文字基本样式1.1 字体大小1.2 字体粗细1.3 字体样式(是否倾斜) 文字-字体1.4 常见字体系列(了解)1.5 字体系列 拓展-层叠性font复合属性文本缩进…

erlang学习:Linux命令学习8

shell脚本案例学习 循环求 1-100 的每一步和 —案例 j0 i1 while((i<100)) do j$((ji)) echo $j ((i)) done每 30 s循环判断一次 user 用户是否登录系统 —案例 设置了一个次数&#xff0c;如果循环了五次在user文件中添加user用户&#xff0c;表示用户登录 USERS"u…

嵌入式 ADC基础知识

在现实世界中&#xff0c;常见的信号大都是模拟量&#xff0c;像温度、声音、气压等&#xff0c;但在信号的处理与传输中&#xff0c;为了减少噪声的干扰&#xff0c;较多使用的是数字量。因此我们经常会将现实中的模拟信号&#xff0c;通过 ADC 转换为数字信号进行运算、传输、…

Java | Leetcode Java题解之第442题数组中重复的数据

题目&#xff1a; 题解&#xff1a; class Solution {public List<Integer> findDuplicates(int[] nums) {int n nums.length;List<Integer> ans new ArrayList<Integer>();for (int i 0; i < n; i) {int x Math.abs(nums[i]);if (nums[x - 1] > …

端到端如火如荼, 传统规划控制还有前途吗?

近些年自动驾驶领域一定绕不开端到端, 伴随着各大车企纷纷转向拥抱端到端, 传统PnC的处境似乎愈发尴尬了起来. 但是端到端真的如水中月镜中花般美好吗? 不可否认深度学习给诸多领域带来了天翻地覆的变化, 但是自动驾驶直接关系到交通安全. 自动驾驶系统的输出, 必须具备足够的…

YOLO11改进|注意力机制篇|引入MLCA轻量级注意力机制

目录 一、MLCA注意力机制1.1MLCA注意力介绍1.2MLCA核心代码 五、添加MLCA注意力机制5.1STEP15.2STEP25.3STEP35.4STEP4 六、yaml文件与运行6.1yaml文件6.2运行成功截图 一、MLCA注意力机制 1.1MLCA注意力介绍 MLCA&#xff08;Multi-Level Channel Attention&#xff0c;多级通…

简单的微信小程序登录 注册 页面及逻辑

一、示例 二、示例代码 1.wxml <!--pages/login.wxml--> <!-- 登录注册文字 --> <view class"title">{{TitleText}}</view> <!-- 登录框 --> <view class"inputBox"><input type"text" placeholder&qu…

Nature Machine Intelligence 基于强化学习的扑翼无人机机翼应变飞行控制

尽管无人机技术发展迅速&#xff0c;但复制生物飞行的动态控制和风力感应能力&#xff0c;仍然遥不可及。生物学研究表明&#xff0c;昆虫翅膀上有机械感受器&#xff0c;即钟形感受器campaniform sensilla&#xff0c;探测飞行敏捷性至关重要的复杂气动载荷。 近日&#xff0…

国庆普及模拟赛-1 赛后总结

题目链接&#xff1a; file:///D:/C/%E9%9B%86%E8%AE%AD%E6%B5%8B%E8%AF%95/1001/2022%20-%20J2.pdf T1&#xff1a;隔离 题意如图。需要求所有时间的最短。 思路&#xff1a; 不需要进行一次次枚举&#xff0c;先算出总共要办事的总时间sum&#xff0c;如果某一次时间超过2…

Mysql数据库~~条件查询、分页查询、修改操作

目录 1.表的其他操作 1.1创建一个表 1.2对于表的排序 1.3修改某一列的名字 1.4使用表达式 1.5删除列的重复项 1.6多个列进行排序 2.条件查询 2.1条件查询语句 2.2比较运算符 2.3条件查询展示 2.4条件查询的先后问题 2.5逻辑运算符使用 2.6模糊查询匹配 2.7对于nu…