ES6 学习笔记(九)Set的基本用法
1 基本用法
set类似于数组,它的成员是唯一的,当有多个相同的值,只会保留一份。
1.1 创建方法
Set本身是一个构造函数,用来生成Set实例,如:
const s = new Set()
let arr = [2, 3, 4, 5, 6, 2, 2]
arr.forEach(x => s.add(x));
for (let i of s) {
console.log(i);
}
上面代码中的add( )方法,可以添加元素到Set实例中,但不会添加重复的值。它返回的是set实例的引用。
输出结果:
2
3
4
5
6
1.2 初始化
Set函数可以接受一个数组(或具有Iterable接口的其他数据结构)作为参数,来初始化Set实例,如:
// 使用new来新建实例
let s1= new Set([1, 2, 3])
Set创建的集合不能直接通过下标访问它的成员,要通过迭代进行访问,如使用forEach方法
1.3 set的简单应用
Set最常见的应用就是去重
1.3.1 数组去重
let items = new Set([1, 2, 2, 2, 3, 4, 5, 6, 1, 1])
console.log([...items]); // 将原数组装成集合并去除重复值保留到新数组中(去重)
输出结果:
[ 1, 2, 3, 4, 5, 6 ]
1.3.2 字符串去重
let str = "aabbccddeeffgg1122334455"
console.log([...new Set(str)].join(""));
输出结果:
abcdefg12345
1.4 内部比较机制
1、向Set实例加入值时不会发生类型转换,如:
let s1 = new Set()
s1.add(1)
s1.add('1')
s1.add(true)
console.log(s1.size); // 3
size属性返回的是Set实例的成员数量
2、利用算法“Same-value equality”来判断加入的值和已有的值是否相等,类似于Object.is( )方法,如果相等则不加入,如:
let s1 = new Set()
let a = {};
let b = a;
s1.add(a);
s1.add(b);
console.log(s1.size); // 1
1.5 链式调用
在new Set()之后,可以通过链式调用向里面添加实例。如:
let s1 = new Set()
s1.add(1).add(2).add(3)
console.log(s1);
输出结果:
Set(3) { 1, 2, 3 }
2 其它方法
2.1 操作方法
| 方法 | 描述 |
|---|---|
| add(value) | 添加值,返回该Set实例的引用 |
| delete(value) | 删除值,返回一个布尔值,表示删除是否成功 |
| has(value) | 返回一个布尔值,表示该值是否是Set实例的成员 |
| clear(value) | 清除所有成员,没有返回值 |
let set = new Set()
set.add(1).add(2).add(3)
console.log(set);
console.log('has2,', set.has(2));
console.log('has5,', set.has(5));
set.delete(1)
console.log('delete1,', set);
set.clear()
console.log('clear,', set);
输出结果:
Set(3) { 1, 2, 3 }
has2, true
has5, false
delete1, Set(2) { 2, 3 }
clear, Set(0) {}
2.2 遍历方法
| 方法 | 描述 |
|---|---|
| keys() | 返回键名的遍历器 |
| values() | 返回键值的遍历器 |
| entries() | 返回键值对的遍历器 |
| forEach() | 使用回调函数遍历每个成员,没有返回值 |
let s2 = new Set(["Chinese", "Math", "English"])
for (let item of s2.keys()) {
console.log(item);
}
输出结果:
Chinese
Math
English
let s2 = new Set(["Chinese", "Math", "English"])
for (let item of s2.values()) {
console.log(item);
}
Set 结构实例的默认遍历器生成的函数就是values方法
输出结果:
Chinese
Math
English
let s2 = new Set(["Chinese", "Math", "English"])
for (let item of s2.entries()) {
console.log(item);
}
输出结果:
[ 'Chinese', 'Chinese' ]
[ 'Math', 'Math' ]
[ 'English', 'English' ]
let s2 = new Set(["Chinese", "Math", "English"])
s2.forEach(value => console.log(value.toUpperCase()))
输出结果:
CHINESE
MATH
ENGLISH
let s2 = new Set(["Chinese", "Math", "English"])
s2.forEach((value, key, s) => {
console.log(s.size);
console.log(key);
console.log(s == this); // this指向window,这里是当纯函数调用。
console.log(value)
})
输出结果:
3
Chinese
false
Chinese
3
Math
false
Math
3
English
false
English
2.3 遍历方法的运用
2.3.1 与扩展运算符结合使用达到去重数组的目的
let arr = [1, 2, 3, 4, 5, 6, 1, 2, 5, 6, 4]
arr = [...new Set(arr)];
console.log(arr);
输出结果:
[ 1, 2, 3, 4, 5, 6 ]
2.3.2 set 间接使用数组的map和filter方法
let s3 = new Set([1, 2, 3, 4, 5, 6])
s3 = new Set([...s3].map(x => x * 2))
console.log(s3);
s3 = new Set([...s3].filter(x => x % 3 == 0))
console.log(s3);
输出结果:
Set(6) { 2, 4, 6, 8, 10, 12 }
Set(2) { 6, 12 }
2.3.3 使用扩展运算符、map、filter和 Set ,实现并集、交集、差集
let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);
//并集
let union = new Set([...a], [...b]);
console.log(union);
//交集
let interect = new Set([...a].filter(x => b.has(x)));
console.log(interect);
//差集
let diffs = new Set([...a].filter(x => !b.has(x)));
console.log(diffs);
输出结果:
Set(3) { 1, 2, 3 }
Set(2) { 2, 3 }
Set(1) { 1 }
2.4 迭代器函数
let obj = {
[Symbol.iterator]: function* () {
yield 1; yield 2; yield 3
}
}
console.log([...obj]);
输出结果:
[1,2,3]
ES6 学习笔记(九)Set的基本用法的更多相关文章
- Mybatis-Plus 实战完整学习笔记(九)------条件构造器核心用法大全(上)
一.Mybatisplus通用(公共方法)CRUD,一共17种(3.0.3版),2.3系列也是这么多,这个新版本一定程度进行了改造和删减. 二.构造器UML图(3.0.3)-----实体包装器,主要用 ...
- ES6学习笔记九:修饰器
一:修饰器(Decorator)是一个函数,用来修改类的行为. 1)定义与使用 function 修饰器名(target) { //target是被修饰对象,可用target.xxx进行调用修改 } ...
- ES6学习笔记<五> Module的操作——import、export、as
import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...
- ES6学习笔记<三> 生成器函数与yield
为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口 ...
- ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring
接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...
- ES6学习笔记<一> let const class extends super
学习参考地址1 学习参考地址2 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015:也 ...
- ES6学习笔记之块级作用域
ES6学习笔记:块级作用域 作用域分类 全局作用域 局部作用域 块级作用域 全局作用域示例 var i=2; for (var i = 0; i < 10; i++) { } console.l ...
- JS&ES6学习笔记(持续更新)
ES6学习笔记(2019.7.29) 目录 ES6学习笔记(2019.7.29) let和const let let 基本用法 let 不存在变量提升 暂时性死区 不允许重复声明 块级作用域 级作用域 ...
- es6学习笔记-class之一概念
前段时间复习了面向对象这一部分,其中提到在es6之前,Javasript是没有类的概念的,只从es6之后出现了类的概念和继承.于是乎,花时间学习一下class. 简介 JavaScript 语言中,生 ...
- 多线程学习笔记九之ThreadLocal
目录 多线程学习笔记九之ThreadLocal 简介 类结构 源码分析 ThreadLocalMap set(T value) get() remove() 为什么ThreadLocalMap的键是W ...
随机推荐
- Spring 04: IOC控制反转 + DI依赖注入
Spring中的IOC 一种思想,两种实现方式 IOC (Inversion of Control):控制反转,是一种概念和思想,指由Spring容器完成对象创建和依赖注入 核心业务:(a)对象的创建 ...
- 虚拟机kali端口映射外网vps
前言:我们常用的kali系统一般都是在虚拟机里面运行,这样在真实环境中外网是访问不到你的kali攻击机的,这时候我们就需要给kali映射一个外网vps. 一.在vps启动frp 服务端 安装frp并解 ...
- Spring源码-xml解析
Spring使用SAX解析xml.SAX的全称是Simple APIs for XML,也即XML简单应用程序接口.与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式. ...
- Springboot+MybatisPlus多数据源比对数据
欢迎关注博主公众号「Java大师」, 专注于分享Java领域干货文章https://www.javaman.cn/ 基于不同的数据源进行数据比对,比较两个数据库的表之间数据的总量,以及处理后的总量,按 ...
- 从零教你使用MindStudio进行Pytorch离线推理全流程
摘要:MindStudio的是一套基于华为自研昇腾AI处理器开发的AI全栈开发工具平台,该IDE上功能很多,涵盖面广,可以进行包括网络模型训练.移植.应用开发.推理运行及自定义算子开发等多种任务. 本 ...
- KingbaseES 多列分区的方法与性能
前言 对于多列分区,可以选择单级多列的范围分区,也可以选择范围加子分区的方式.但二者在不同场景下对于性能是有差异的,这里的性能差异主要是分区裁剪引起的差异. 例子 创建两张分区表,采取不同的分区策略: ...
- mysql explain总结
Explain 包含字段 id select_type table type possible_keys key key_len ref rows extra 字段解释 1. id id 相同则执行顺 ...
- 2021年3月-第01阶段-Linux基础-Linux系统的启动流程
Linux系统的启动流程 理解Linux操作系统启动流程,能有助于后期在企业中更好的维护Linux服务器,能快速定位系统问题,进而解决问题. 上图为Linux操作系统启动流程 1.加载BIOS 计算机 ...
- 一门能让你五分钟学会的语言-Brainfuck
看到标题,不出意外的话,你肯定开始骂我了:**标题党,什么编程语言五分钟就能学会? 其实我本来也是不相信的,但是学过了才知道这是真的. 1.Brainfuck 看到这个小标题,不要误会,我没有骂人. ...
- 使用Docker方式部署Gitlab,Gitlab-Runner并使用Gitlab提供的CI/CD功能自动化构建SpringBoot项目
1.Docker安装Gitlab,地址:https://www.cnblogs.com/sanduzxcvbnm/p/13814730.html 2.Docker安装Gitlab-runner,地址: ...