JavaScript的Set数据结构详解


Posted in Javascript onFebruary 18, 2022

1. 什么是 Set

Set 可以简单的看作是数学上的集合。

它是一系列无序,没有重复数值的数据集合。

2. Set 构造函数

对于 Set 的构造函数的参数,可以传递以下几种形式。

2.1) 数组

const s = new Set([1, 2, 1]);
console.log(s);

JavaScript的Set数据结构详解

这里传递了一个数组[1, 2, 1]作为参数,由于 Set 是无重复数值的集合,所以第三个 1 自动删除了。

2.2) 字符串

const s = new Set("Hello World!");
console.log(s);

JavaScript的Set数据结构详解

2.3) arguments

function fun() {
    const s = new Set(arguments);
    console.log(s);
}

fun(1, 2, 3);

JavaScript的Set数据结构详解

2.4) NodeList

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>set</title>
</head>
<body>
    <p>1</p>
    <p>2</p>
    <p>3</p>
    
    <script>
        const s = new Set(document.querySelectorAll('p'));
        console.log(s);
    </script>
</body>
</html>

JavaScript的Set数据结构详解

这里将三个p标签的引用放进了Set s中;

当我们要用的时候,就可以遍历这个 Set,然后分别将p标签的引用取出来,然后就可以对p标签进行修改了。

2.5)  Set

const s1 = new Set([1, 2, 3]);
const s2 = new Set(s1);
console.log(s2);

JavaScript的Set数据结构详解

这里相当于把s1复制过去,给了s2,不过它们不是同一个Set

console.log(s1 === s2);

JavaScript的Set数据结构详解

3. Set 的实例属性和方法

Set 的属性,有一个属性size,用来存储它的成员个数

const s = new Set([1, 2, 3]);
console.log(s.size);

JavaScript的Set数据结构详解

Set的方法

  • add

给 Set 中添加成员

const s = new Set([1, 2, 3]);
// 它的参数只能传一个
s.add(5);
console.log(s);
// 可以连缀 add
s.add(7).add(9);
console.log(s);

JavaScript的Set数据结构详解

  • delete

用来删除 Set 中的成员

const s = new Set([1, 2, 3]);
s.delete(2);
// 如果要删除的东西在 Set 中找不到,将什么也不会发生,也不会报错
s.delete(5);
console.log(s);

JavaScript的Set数据结构详解

  • has

用来判断 Set 是否含有某个成员

const s = new Set([1, 2, 3]);
console.log(s.has(1));
console.log(s.has(5));

JavaScript的Set数据结构详解

  • clear

将会删除 Set 的所有成员

const s = new Set([1, 2, 3]);
s.clear();
console.log(s);

JavaScript的Set数据结构详解

4. Set 的成员访问

它的成员访问要通过 forEach 方法实现,遍历 Set,它的遍历是按成员的添加顺序来进行遍历的。

它有两个参数,第一个参数为回调函数,第二个参数设定回调函数中this指向什么,即

s.forEach(回调函数, 回调函数的指向)

我们先来看第一个参数:

对于第一个参数回调函数,它有三个参数:

s.forEach(function(value, key, set){
	value 就是 Set 的成员
	在 Set 中,value 和 key 是相等的
	set 就是前面Set的本身,即这里 set === s
});

通过一个例子理解一下:

const s = new Set([1, 2, 3]);
s.forEach(function(value, key, set) {
    console.log(value, key, value === key);
    console.log(set, set === s);
});

JavaScript的Set数据结构详解

再来看第二个参数:

const s = new Set([1, 2, 3]);
s.forEach(function(value, key, set) {
    console.log(this);
}, document);

JavaScript的Set数据结构详解

5. Set 的注意事项

Set 对重复值的判断基本遵循严格相等===的判断

不过对于NaN,在 Set 中,NaN 等于 NaN

6. Set 的使用场景

数组去重

let arr = [1, 2, 1];
const s = new Set(arr);
arr = [...s];
// 也可以合成一句
// arr = [...new Set(arr)];
console.log(arr);

JavaScript的Set数据结构详解

字符串去重

let str = "11231131242";
const s = new Set(str);
str = [...s].join("");
// 也可以写成一句
// str = [...new Set(str)].join("");
console.log(str);

JavaScript的Set数据结构详解

存放 DOM 元素

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>set</title>
</head>
<body>
    <p>1</p>
    <p>2</p>
    <p>3</p>
    
    <script>
        const s = new Set(document.querySelectorAll('p'));
        s.forEach((elem) => {
            console.log(elem)
        });
    </script>
</body>
</html>

JavaScript的Set数据结构详解

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注三水点靠木的更多内容!

Javascript 相关文章推荐
用jquery中插件dialog实现弹框效果实例代码
Nov 15 Javascript
基于Bootstrap+jQuery.validate实现Form表单验证
Dec 16 Javascript
js实现文本框选中的方法
May 26 Javascript
在Node.js应用中使用Redis的方法简介
Jun 24 Javascript
获取select的value、text值的简单示例(jquery与javascript)
Dec 07 Javascript
详解JavaScript中this的指向问题
Jan 20 Javascript
jQuery EasyUI结合zTree树形结构制作web页面
Sep 01 jQuery
vue 组件 全局注册和局部注册的实现
Feb 28 Javascript
vue quill editor 使用富文本添加上传音频功能
Jan 14 Javascript
javascript实现滚动条效果
Mar 24 Javascript
详解React 条件渲染
Jul 08 Javascript
JavaScript实现简易计算器小功能
Oct 22 Javascript
JS封装cavans多种滤镜组件
HTML+JS实现在线朗读器
Feb 15 #Javascript
js中Map和Set的用法及区别实例详解
Feb 15 #Javascript
canvas实现贪食蛇的实践
Vue自定义铃声提示音组件的实现
Jan 22 #Vue.js
JavaScript实例 ODO List分析
Jan 22 #Javascript
JavaScript ES6的函数拓展
Jan 18 #Javascript
You might like
php实现utf-8和GB2312编码相互转换函数代码
2013/02/07 PHP
laravel-admin 中列表筛选方法
2019/10/03 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
2019/12/31 PHP
jQuery学习笔记 获取jQuery对象
2012/09/19 Javascript
js实现简单的星级选择器提交效果适用于评论等
2013/10/18 Javascript
Javascript简单实现可拖动的div
2013/10/22 Javascript
基于jquery实现的树形菜单效果代码
2015/09/06 Javascript
关于List.ToArray()方法的效率测试
2016/09/30 Javascript
jquery动态创建div与input的实例代码
2016/10/12 Javascript
react.js CMS 删除功能的实现方法
2017/04/17 Javascript
详解vue嵌套路由-params传递参数
2017/05/23 Javascript
JS实现的走迷宫小游戏完整实例
2017/07/19 Javascript
ionic2懒加载配置详解
2017/09/01 Javascript
总结JavaScript在IE9之前版本中内存泄露问题
2018/04/28 Javascript
jQuery each和js forEach用法比较
2019/02/27 jQuery
nest.js 使用express需要提供多个静态目录的操作方法
2019/10/24 Javascript
[02:43]2014DOTA2国际邀请赛 官方Alliance战队纪录片
2014/07/14 DOTA
[50:20]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第四局
2016/03/06 DOTA
[01:32]寻找你心中的那团火 DOTA2 TI9火焰传递活动今日开启
2019/05/16 DOTA
使用go和python递归删除.ds store文件的方法
2014/01/22 Python
Python 数据结构之堆栈实例代码
2017/01/22 Python
python通过pip更新所有已安装的包实现方法
2017/05/19 Python
matplotlib绘制符合论文要求的图片实例(必看篇)
2017/06/02 Python
浅谈使用Python内置函数getattr实现分发模式
2018/01/22 Python
Python中数组,列表:冒号的灵活用法介绍(np数组,列表倒序)
2018/04/18 Python
Python 动态变量名定义与调用方法
2020/02/09 Python
详解pandas apply 并行处理的几种方法
2021/02/24 Python
main 函数执行以前,还会执行什么代码
2013/04/17 面试题
应届生保险求职信
2013/11/11 职场文书
成功的餐厅经营创业计划书
2014/01/15 职场文书
《孙权劝学》教学反思
2014/04/23 职场文书
档案保密承诺书
2014/06/03 职场文书
妇联领导班子剖析材料
2014/08/21 职场文书
初中体育教学随笔
2015/08/15 职场文书
go xorm框架的使用
2021/05/22 Golang
分析Netty直接内存原理及应用
2021/06/14 Java/Android