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 相关文章推荐
清空上传控件input file的值
Jul 03 Javascript
juqery 学习之五 文档处理 包裹、替换、删除、复制
Feb 11 Javascript
cookie.js 加载顺序问题怎么才有效
Jul 31 Javascript
Bootstrap实现弹性搜索框
Jul 11 Javascript
js 点击a标签 获取a的自定义属性方法
Nov 21 Javascript
微信小程序 MD5加密登录密码详解及实例代码
Jan 12 Javascript
html中通过JS获取JSON数据并加载的方法
Nov 30 Javascript
Swiper自定义分页器使用详解
Dec 28 Javascript
基于vue如何发布一个npm包的方法步骤
May 15 Javascript
vue实现axios图片上传功能
Aug 20 Javascript
Vue.js中的高级面试题及答案
Jan 13 Javascript
使用JavaScript获取扫码枪扫描得到的条形码的思路代码详解
Jun 10 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
PHPShop存在多个安全漏洞
2006/10/09 PHP
php实现通用的信用卡验证类
2015/03/24 PHP
yii权限控制的方法(三种方法)
2015/12/28 PHP
Laravel框架处理用户的请求操作详解
2019/12/20 PHP
PHP sdk文档处理常用代码示例解析
2020/12/09 PHP
javascript陷阱 一不小心你就中招了(字符运算)
2013/11/10 Javascript
JQuery实现Ajax加载图片的方法
2015/12/24 Javascript
jquery实现列表上下移动功能
2016/02/25 Javascript
jQuery获取单击节点对象的方法
2016/06/02 Javascript
Vuex2.0+Vue2.0构建备忘录应用实践
2016/11/30 Javascript
JavaScript实现获取用户单击body中所有A标签内容的方法
2017/06/05 Javascript
微信小程序三级联动地址选择器的实例代码
2017/07/12 Javascript
JavaScript实现元素滚动条到达一定位置循环追加内容
2017/12/28 Javascript
vue.js移动数组位置,同时更新视图的方法
2018/03/08 Javascript
5分钟学会Vue动画效果(小结)
2018/07/21 Javascript
Python决策树之基于信息增益的特征选择示例
2018/06/25 Python
Python常用特殊方法实例总结
2019/03/22 Python
python+logging+yaml实现日志分割
2019/07/22 Python
python中利用matplotlib读取灰度图的例子
2019/12/07 Python
使用SQLAlchemy操作数据库表过程解析
2020/06/10 Python
Python Scrapy多页数据爬取实现过程解析
2020/06/12 Python
利用Python实现学生信息管理系统的完整实例
2020/12/30 Python
CSS3教程(4):网页边框和网页文字阴影
2009/04/02 HTML / CSS
浅谈HTML5新增及移除的元素
2016/06/27 HTML / CSS
HTML5 Canvas入门学习教程
2016/03/17 HTML / CSS
中学教师自我鉴定
2014/02/07 职场文书
《小蝌蚪找妈妈》教学反思
2014/02/21 职场文书
教师校本培训方案
2014/02/26 职场文书
主持人演讲稿
2014/05/13 职场文书
环保建议书600字
2014/05/14 职场文书
企业员工薪酬方案
2014/06/04 职场文书
房产授权委托书范本
2014/09/22 职场文书
党的群众路线专项整治方案
2014/11/03 职场文书
数学教师个人总结
2015/02/06 职场文书
2015年党员创先争优公开承诺书
2015/04/27 职场文书
Nginx使用X-Accel-Redirect实现静态文件下载的统计、鉴权、防盗链、限速等
2021/04/04 Servers