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 相关文章推荐
学习ExtJS Window常用方法
Oct 07 Javascript
js实现select跳转功能代码
Oct 22 Javascript
html的DOM中document对象forms集合用法实例
Jan 21 Javascript
javascript结合CSS实现苹果开关按钮特效
Apr 07 Javascript
jscript读写二进制文件的方法
Apr 22 Javascript
JavaScript中函数表达式和函数声明及函数声明与函数表达式的不同
Nov 15 Javascript
jQuery简单实现页面元素置顶时悬浮效果示例
Aug 01 Javascript
开源免费天气预报接口API及全国所有地区代码(国家气象局提供)
Dec 26 Javascript
Angular2搜索和重置按钮过场动画
May 24 Javascript
详解webpack2+React 实例demo
Sep 11 Javascript
JS实现横向轮播图(中级版)
Jan 18 Javascript
Vue Object 的变化侦测实现代码
Apr 15 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
《一拳超人》埼玉一拳下去,他们存在了800年毫无意义!
2020/03/02 日漫
PHP截取汉字乱码问题解决方法mb_substr函数的应用
2008/03/30 PHP
PHP 采集程序原理分析篇
2010/03/05 PHP
php打开文件fopen函数的使用说明
2013/07/05 PHP
Yii2配置Nginx伪静态的方法
2017/05/05 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
2017/09/22 PHP
laravel框架的安装与路由实例分析
2019/10/11 PHP
通过 Dom 方法提高 innerHTML 性能
2008/03/26 Javascript
JS实现鼠标单击与双击事件共存
2014/03/08 Javascript
JS实现双击编辑可修改状态的方法
2015/08/14 Javascript
浅析Bootstrap缩略图组件与警示框组件
2016/04/29 Javascript
JQuery 传送中文乱码问题的简单解决办法
2016/05/24 Javascript
Node.JS文件系统解析实例详解
2017/05/15 Javascript
关于jQuery里prev()的简单操作代码
2017/10/27 jQuery
vue.js获得当前元素的文字信息方法
2018/03/09 Javascript
记录vue做微信自定义分享的一些问题
2019/09/12 Javascript
jQuery实现简单评论功能
2020/08/19 jQuery
在Python中使用AOP实现Redis缓存示例
2017/07/11 Python
快速了解Python相对导入
2018/01/12 Python
Python机器学习logistic回归代码解析
2018/01/17 Python
Python处理命令行参数模块optpars用法实例分析
2018/05/31 Python
Python监控服务器实用工具psutil使用解析
2019/12/19 Python
基于python实现检索标记敏感词并输出
2020/05/07 Python
python 检测nginx服务邮件报警的脚本
2020/12/31 Python
完美解决Pycharm中matplotlib画图中文乱码问题
2021/01/11 Python
CSS3教程(4):网页边框和网页文字阴影
2009/04/02 HTML / CSS
用缩写的指针比较"if(p)" 检查空指针是否可靠?如果空指针的内部表达不是0会怎么样?
2014/01/05 面试题
《最大的“书”》教学反思
2014/02/14 职场文书
网吧管理制度范本
2015/08/05 职场文书
2016年11月份红领巾广播稿
2015/12/21 职场文书
Django利用AJAX技术实现博文实时搜索
2021/05/06 Python
OpenCV全景图像拼接的实现示例
2021/06/05 Python
详解Python类和对象内容
2021/06/22 Python
PHP遍历数组的6种方式总结
2021/11/17 PHP
python内置模块之上下文管理contextlib
2022/06/14 Python
Java实现注册登录跳转
2022/06/16 Java/Android