ES6的Set与Map

在ES6之前,我们存储数据的结构主要有两种:数组、对象,而在ES6中新增了另外两种数据结构:Set、Map。

一、什么是Set?

Set是ES6新增的数据结构,类似数组,但是它的元素成员是唯一的。

Set的使用,属性和方法
1. 创建Set

① new Set()方式创建

let a = new Set()

 ② 通过传入数组方式创建

let a = new Set([1, 2, 'akun'])
 2. Set.size:返回Set中元素的数量
let a = new Set([1, 2, 'akun'])

a.size // 3
3. Set.has(key):查找Set对象中是否存在key,返回一个布尔值
let a = new Set([1, 2, 'akun'])

a.has('akun') // true
 4. Set.add(key):往Set对象中添加一个元素
let a = new Set()

a.add(1)
5. Set.delete(key):删除元素key 
let a = new Set([1, 2, 'akun'])

a.delete("akun")
6. Set.clear(): 清空Set的全部元素 
let a = new Set([1, 2, 'akun'])

a.clear()
 7. 遍历 Set

① forEach 遍历 

let a = new Set([1, 2, 'akun'])

a.forEach(item => {
  console.log(item)
})

 ② for of 遍历

let a = new Set([1, 2, 'akun'])

for(let item of a) {
 console.log(item)
}
8. Set 转 数组 

① 使用 Array.from 方法 

let a = new Set([1, 2, 'akun'])

let arr = Array.from(a)

② 使用扩展运算符

let a = new Set([1, 2, 'akun'])

let arr = [...a]

Set的使用场景:如可以利用元素成员唯一性实现数组去重,方法has()判断是否有某个元素等等。 

代码的实现:

 // 数组去重
 let arr = [1, 1, 2, 3]
 let unique = [...new Set(arr)] // [1, 2, 3]
 

 let a = new Set([1, 2, 'akun'])
 let b = new Set([2, 3, 4])

 // 并集
 let union = [...new Set([...a, ...b])] // [1, 2, 'akun', 3, 4]

 // 交集
 let intersect = [...new Set([...a].filter(item => b.has(item)))] // [2]

 // 差集
 let difference = [
   ...new Set([...a].filter(item => !b.has(item))),
   ...new Set([...b].filter(item => !a.has(item))),
 ] //  [1, 'akun', 3, 4]

二、什么是Map?

Map是ES6新增的数据结构,类似于对象,本质上就是键值对的集合,对象的键只能是字符串或者Symbols,但Map的键可以为任意类型。

Map的使用,属性和方法 
1. 创建Map 

① new Map()方式创建 

let a = new Map()

② 通过传入二维数组方式创建 

let kvArray = [
  ['key1', 'value1'],
  ['key2', 'value2'],
]

let a = new Map(kvArray)
2. Map.size:返回Map对象中键值对数量 
let kvArray = [
  ['key1', 'value1'],
  ['key2', 'value2'],
]

let a = new Map(kvArray)
a.size // 2
3. Map.has(key):查找Map对象中是否存在key,返回一个布尔值 
let kvArray = [
  ['key1', 'value1'],
  ['key2', 'value2'],
]

let a = new Map(kvArray)
a.has('key1') // true
4. Map.set(key, value):设置Map对象的键值对(键名,键值),返回当前对象 
let a = new Map()
a.set(0, 'zero')
a.set('key1', 'value1')
 5. Map.get(key):返回key值对应的value,如果key不存在则返回undefined
let kvArray = [
  ['key1', 'value1'],
  ['key2', 'value2'],
]

let a = new Map(kvArray)
a.get('key1') // value1
6. Map.delete(key):删除Map对象中键名为key的键值对 
let kvArray = [
  ['key1', 'value1'],
  ['key2', 'value2'],
]

let a = new Map(kvArray)
a.delete("key1")
7. Map.clear():移除Map对象中保存的所有键名/键值对
let kvArray = [
  ['key1', 'value1'],
  ['key2', 'value2'],
]

let a = new Map(kvArray)
a.clear()
 8. 遍历 Map

① forEach 遍历 

let kvArray = [
  ['key1', 'value1'],
  ['key2', 'value2'],
]

let a = new Map(kvArray)

a.forEach((value, key) => {
  console.log(key, value)
})

 ② for of 遍历

let kvArray = [
  ['key1', 'value1'],
  ['key2', 'value2'],
]

let a = new Map(kvArray)

for (let [key, value] of a) {
  console.log(key, value)
}
 9. Map.keys():返回一个新的Iterator对象,它包含按照顺序插入Map对象中每个元素的key值
let kvArray = [
  ['key1', 'value1'],
  ['key2', 'value2'],
]

let a = new Map(kvArray)

for (let key of a.keys()) {
  console.log(key)
}
 10. Map.values():返回一个新的Iterator对象,它包含按照顺序插入Map对象中每个元素的value值
let kvArray = [
  ['key1', 'value1'],
  ['key2', 'value2'],
]

let a = new Map(kvArray)

for (let value of a.values()) {
  console.log(value)
}
 11. Map.entries():该方法返回一个新的Iterator对象,它包含按顺序插入Map对象中每个[key, value]数组
let kvArray = [
  ['key1', 'value1'],
  ['key2', 'value2'],
]

let a = new Map(kvArray)

for (let [key, value] of a.entries()) {
  console.log(key, value)
}
 12. Map 转 数组

① 使用 Array.from 方法

let kvArray = [
  ['key1', 'value1'],
  ['key2', 'value2'],
]

let a = new Map(kvArray)
let arr = Array.from(a)

② 使用扩展运算符

let kvArray = [
  ['key1', 'value1'],
  ['key2', 'value2'],
]

let a = new Map(kvArray)
let arr = [...a]

 Map的使用场景:不关心键值对的键名到底是什么,那么在这种情况下,可以用Map。

 三、总结

 1、Set:是一组Key的集合,但不存储Value,由于Key不能重复,因此他最大的特点是所有的元素都是唯一的;

2、Map:是键值对的集合,为JS带来了真正的键值存储机制;允许任何类型的键,具有极快的查找速度(存储键值较少的情况下)。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

eNSP-OSPF综合实验

目录 实验要求 配置IP 构建外部RIP协议用户组 配置公网通 构建MGRE隧道 创建隧道 配置下一跳解析协议(NHRP) OSPF私网通 area 0(公网区域不宣告): area 1: area 2: area 3&#xff…

案例实践 | InterMat:基于长安链的材料数据发现与共享系统

案例名称:InterMat-基于区块链的材料数据发现与共享系统 ■ 建设单位 北京钢研新材科技有限公司 ■ 用户群体 材料数据上下游单位 ■ 应用成效 已建设10共识节点、50轻节点,1万注册用户 案例背景 材料是构成各种装备和工程的物质载体&#xff0c…

【C++题解】1345. 玫瑰花圃

问题:1345. 玫瑰花圃 类型:基本运算、小数运算 题目描述: 有一块nn(n≥5,且 n 是奇数)的红玫瑰花圃,由 nn 个小正方形花圃组成,现要求在花圃中最中间的一行、最中间的一列以及 4 个…

cesium加载倾斜影像数据(模拟雨、雪、雾、无人机飞行、测距、箭头标绘、电子围栏等)

实现效果如下: 功能菜单如下: 加载倾斜影像核心代码: var palaceTileset new Cesium.Cesium3DTileset({url: http://127.0.0.1:9002/tileset.json,//控制切片视角显示的数量,可调整性能maximumScreenSpaceError: 0.1,maximumNum…

Real3DPortrait照片对口型,数字人,音频/视频驱动数字人

先看效果 上传一张图片和一段音频,照片如下: 合成后效果如下: 照片对口型-音频驱动 支持音频驱动和视频驱动,视频可以使照片有参照视频中的口型和和动作。 项目地址 https://github.com/yerfor/Real3DPortrait 我的环境 win…

CentOS-Stream-9升级openssh9.7p

CentOS Stream 9 ssh -V需要的RPM包 openssh-9.7p1-1.el9.x86_64.rpm openssh-clients-9.7p1-1.el9.x86_64.rpm openssh-server-9.7p1-1.el9.x86_64.rpm 编译openssh openssh官方只提供源码包,我们选择自己将源码编译为rpm包来升级环境的openssh,需要…

UE5 C++ 使用TimeLine时间轴实现开关门

一.添加门头文件 和 声明 #include "Components/TimelineComponent.h" #include"Components/BoxComponent.h" UPROPERTY(EditAnywhere,BlueprintReadWrite,Category "MyCurve")UCurveFloat* MyCurveFloat;UPROPERTY(EditAnywhere, BlueprintR…

前端网络---http缓存

什么是http缓存? 1、HTTP 缓存会存储与请求关联的响应,并将存储的响应复用于后续请求。 2、缓存的原理是在首次请求后保存一份请求资源的响应副本,当用户再次发起相同请求时,判断缓存是否命中,如果命中则将前面的响应…

如何保障UDP传输中数据文件不丢失?

UDP协议因其低时延和高速传输的特性,在实时应用和大量数据传输领域中发挥着不可或缺的作用。但是,由于UDP是一种无连接的通讯协议,它并不确保数据包的顺序、完整性和可靠性。 为了解决UDP传输中数据一致性的问题,技术专家们进行了…

HTML不常用的文本标签

1.标签如下&#xff1a; 代码及相关内容 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>不常用的文…

2024第二十一届五一数学建模C题思路 五一杯建模思路

文章目录 1 赛题思路2 比赛日期和时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

大数据测试:构建Hadoop和Spark分布式HA运行环境

随着大数据技术的不断发展&#xff0c;Hadoop和Spark已成为处理大规模数据的热门框架。在生产环境中&#xff0c;高可用性&#xff08;HA&#xff09;是至关重要的&#xff0c;以确保数据处理和分析任务不受中断。本文将详细介绍如何构建 Hadoop和Spark分布式HA运行环境&#x…

Ubuntu 22.04 配置VirtualBox安装Windows 10虚拟机

Ubuntu 22.04 配置VirtualBox安装Windows 10虚拟机 文章目录 Ubuntu 22.04 配置VirtualBox安装Windows 10虚拟机1.安装virtualbox2.下载Window.iso文件并载入3.问题解决3.1 Kernel driver not installed (rc-1908)3.2 VT-x is disabled in the BIOS for all CPU modes 4.安装Wi…

中文编程入门(Lua5.4.6中文版)第十三章 Lua 文件操作

在《Lua世界》的冒险旅途中&#xff0c;勇士们时常需要与神秘的文本卷轴打交道。为了更好地掌握这些知识宝藏&#xff0c;Lua I/O库提供了两种强大的探索模式&#xff1a;简单模式和完全模式&#xff0c;助你轻松应对各类文献挑战。 简单模式&#xff1a;初识卷轴 简单模式如…

如何精心挑选合适的软件公司

选择一家合适的软件公司对于小程序商城的开发与运营而言&#xff0c;具有举足轻重的意义。面对市场上琳琅满目的软件公司&#xff0c;如何找到那个真正适合自己的合作伙伴呢&#xff1f;接下来&#xff0c;我们将从需求分析、公司资质、项目案例、服务态度和成本效益五个方面&a…

Linux0.11 源码中的内存分页机制

学习Linux的源码&#xff0c;《深入linux 内核架构》这本书看起来就让人害怕&#xff0c;然后就想着看看早期的linux版本的源码&#xff0c;从网上查看资料发现linux0.11 这个版本有很多人拿来当成教学版本&#xff0c;而且也有很多的参考书以这个版本作为基础来讲解&#xff0…

【数据挖掘】实验8:分类与预测建模

实验8&#xff1a;分类与预测建模 一&#xff1a;实验目的与要求 1&#xff1a;学习和掌握回归分析、决策树、人工神经网络、KNN算法、朴素贝叶斯分类等机器学习算法在R语言中的应用。 2&#xff1a;了解其他分类与预测算法函数。 3&#xff1a;学习和掌握分类与预测算法的评…

UTS iOS插件

1、UTS插件无法出现 再uniapp x中使用时&#xff0c;必须给这个插件高度和宽度&#xff0c;否则出不来&#xff01; <uts-hello-view buttonText"点击按钮内容" style"width:375px;height: 375px;background-color: aqua;"></uts-hello-view>…

关于外网java后端服务访问内网minio中间件,因连接minio超时,启动失败问题

注&#xff1a;服务器情况&#xff1a;2台服务器&#xff0c;内网服务器包含&#xff08;activemq、minio、nginx、redis、mysql、后端java服务&#xff09;。外网服务器只有后端java服务&#xff0c;访问内网的中间件&#xff08;内网服务器开放了部分指定端口&#xff09; 问…

技术速递|.NET 智能组件简介 – AI 驱动的 UI 控件

作者&#xff1a;Daniel Roth 排版&#xff1a;Alan Wang AI 的最新进展有望彻底改变我们与软件交互和使用软件的方式。然而&#xff0c;将 AI 功能集成到现有软件中可能面临一些挑战。因此&#xff0c;我们开发了新的 .NET 智能组件&#xff0c;这是一组真正有用的 AI 支持的 …
最新文章