【ES6】Set 和 Map 数据结构

2023-11-17


前言

Set 、 Map为ES6新增的数据结构。


一、Set

ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
Set 本身是一个构造函数,用来生成 Set 数据结构。

1. 用法详解

1.1 声明方式

// 声明方式
let s = new Set()
console.log(s)

//唯一的
let s = new Set([1, 2, 3, 2])
// 添加新的值
s.add('kaka').add('Dorothy') // 支持链式操作
// s.delete(2) // 删除2
// s.clear() // 清空
console.log(s.has('kaka')) //true,判断是否包含某个值
console.log(s) // 1 2 3 kaka Dorothy
console.log(s.size) // 输出Set的长度

1.2 遍历的四种方式

  • keys() :返回键名的遍历器
  • values() :返回键值的遍历器
  • entries() :返回键值对的遍历器
  • forEach():使用回调函数遍历每个成员
s.forEach(item => console.log(item))

for (let item of s) {
    console.log(item)
}
for (let item of s.keys()) {
    console.log(item)
}
for (let item of s.values()) {
    console.log(item)
}
for (let item of s.entries()) {
    console.log(item[0], item[1])
    //1 1
    //2 2
    //3 3
    //kaka kaka
    //Dorothy Dorothy
}

Set相当于也有key:value,只不过它的key和value是相同的。

2. 应用场景

2.1 数组去重

let arr = [1, 2, 3, 4, 2, 3]
let s = new Set(arr)
console.log(s)

2.2 合并去重

let arr1 = [1, 2, 3, 4]
let arr2 = [2, 3, 4, 5, 6]
let s = new Set([...arr1, ...arr2])
console.log(s)
// {1, 2, 3, 4, 5, 6}

// set->array
console.log([...s])
console.log(Array.from(s))
//[1, 2, 3, 4, 5, 6]

2.3交集

let s1 = new Set(arr1)
let s2 = new Set(arr2)
let result = new Set(arr1.filter(item => s2.has(item)))
//{2, 3, 4}
console.log(Array.from(result))
//[2, 3, 4]

2.4 差集

let arr3 = new Set(arr1.filter(item => !s2.has(item)))
let arr4 = new Set(arr2.filter(item => !s1.has(item)))
console.log(arr3)
//{1}
console.log(arr4)
//{5, 6}
console.log([...arr3, ...arr4])
//[1, 5, 6]

3. WeakSet

WeakSet只能够存储对象(与Set的区别1),数字、字符串等原始数据对象不能够放进去。WeakSet不能够遍历区别2)。

let ws = new WeakSet()
const obj1 = {
    name: 'kaka'
}
const obj2 = {
    age: 5
}
ws.add(obj1)
ws.add(obj2)
// 删除对象
ws.delete(obj1)
console.log(ws)
//仅剩obj2

console.log(ws.has(obj2))
//true

ws.forEach(item => console.log(item))
//报错

垃圾回收机制:GC +1 +1,只要GC后面的值不为0,则不会被回收,所以可能会有内存泄漏的风险。
WeakSet 的对象是弱引用,它不会被计入垃圾回收机制区别3),所以不管它是否还有引用,当前使用完之后便回收了,可用于临时存放对象。

二、Map

JavaScript 的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键。这给它的使用带来了很大的限制。为了解决这个问题,ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以 当作键。也就是说,Object 结构提供了“字符串-值”的对应,Map 结构提供了“值-值”的对应,是一种更完善的 Hash 结构实现。如果需要“键值 对”的数据结构,Map 比 Object 更合适。

1. 用法详解

1.1 声明方式

let m = new Map()
let obj = { 
    name: 'kaka'
}
// set添加新的值 key:value
m.set(obj, 'es')
console.log(m)
// 输出整个Map
// get获取值
console.log(m.get(obj)) // es
// 删除
m.delete(obj)
// 判断是否包含当前这个key对应的值
console.log(m.has(obj))

将数组作为参数:

// 将数组作为参数
let map = new Map([
    ['name', 'kaka'],
    ['age', 5]
])
console.log(map.size)
// 2
console.log(map.has('name')) // true
console.log(map.get('age')) // 5
map.set('name', 'wengweng') // "name" => "wengweng"
map.delete('name') // 删除
map.clear() // 清空
console.log(map)

1.2 遍历的四种方式

  • keys() :返回键名的遍历器
  • values() :返回键值的遍历器
  • entries() :返回键值对的遍历器
  • forEach():使用回调函数遍历每个成员(注意:forEach遍历方式传递的参数是(value, key)的形式,值在前键在后

与Set的区别是,Set的key和value是相同的,而Map的不同。

//遍历
map.forEach((value, key) => console.log(value, key))

for(let [key, value] of map){
    console.log(key, value)
}

for(let key of map.keys()){
    console.log(key)
}

for(let value of map.values()){
    console.log(value)
}

for(let [key, value] of map.entries()){
    console.log(key, value)
}

与Object比较:
① Map判断是否包含某个属性时可直接调用.has(),而Object需要循环遍历才能够判断,所以Map的api更加灵活。
② Map的key更多样。
③ Map可直接通过.size()来获取键值对的个数,而Object仍需要循环。
④ Object含有自己的原型,原型链上的名字与自己定义的键名可能会冲突。

2. 应用场景

使用Object的场景都可考虑使用Map。

3. WeakMap

WeakMap与Map的结构相似,不同点在于:WeakMap的键名(key)仅支持引用数据类型(对象、数组、函数),且WeakMap不支持遍历,也是一种弱引用,不会被计入垃圾回收机制。

let wm = new WeakMap()
wm.set([1], 2)
wm.set({
    name: 'kaka'
}, 'es')
// WeakMap不支持clear清空
wm.clear() // 报错
// WeakMap不支持size方法(因为也涉及到遍历)
console.log(wm.size) // undefined

// 应用场景
let wm = new WeakMap()
let elem = document.getElementsByTagName('h1')
wm.set(elem, 'info')
console.log(wm.get(elem))

总结

Set相对于数组(Array)
Map相对于对象(Object)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【ES6】Set 和 Map 数据结构 的相关文章

随机推荐

  • proteus 8.8 sp1 (含汉化、破解)安装方法

    若是按照此方法存在问题 欢迎大家留言评论 一 下载地址 链接 https pan baidu com s 1VtYO2dwKRV bMSG6xy6OEQ 提取码 pp9q 二 软件介绍 proteus软件在单片机仿真上面比较优越 8 6版本
  • linux与centos的关系

    首先大家应该都知道 操作系统主要分3个部分 分别是 内核 库 应用程序 内核主要管理与硬件的直接交互的原语代码就类似dao层的一个方法 是原子性的 而库是对内核的进一步封装 当一个功能需要多个原语时 就比如有的程序 需要键盘的输入 还需要显
  • UTSC-TK2016工具集使用笔记

    1 Pcap2Session ps1 对原始流量文件进行切分 以会话 所有层 会话 应用层 流 所有层 流 应用层的形式对原始流量文件进行切分 删除文件长度为0的数据 删除重复文件 生成2 Session文件夹 2 ProcessSessi
  • 数据结构实训-学生信息管理程序C语言版

    问题描述 学生信息包括 学号 姓名 年龄 性别 出生年月 地址 电话和 E mail等 试设计一个学生信息管理程序 实现学生信息的电子化管理 要求 使用文件方式存储数据 采用链表组织学生数据 基本要求 2 基本要求 系统以菜单方式工作 学生
  • java计算两个日期之间相差天数和相隔天数详解

    大家看到文章标题 两个日期之间相差天数和相隔天数 是否有疑惑呢 从中文字面理解 相差 和 相隔 是有区别的 然而就是这些区别害死很多人 却没有发现 在大量新增统计时是差之毫厘谬以千里 我能都发现是因为一个偶然的机会 一个项目运行几年却没有人
  • Ubuntu20.04安装后,root账户无法登录,ssh无法远程连接处理方法

    最近一直在用Ubuntu系统 发现了一些规律性的东西 每当安装完系统就得去做一些事情 要不然无法正常丝滑的使用 我把这几个罗列出来 装机的步骤我就省了 比较简单跟着向导来就行 不要最小化安装就行 1 更换apt 源为阿里云镜像源 下载包的时
  • 在前端页面下拉框动态显示数据库查询出来的结果,供客户勾选,限制客户自建字段(java版)

    最终效果 案例 前端代码 首先引入标签库jar和html代码 div class form group div
  • 08黑马笔记之栈的应用_就近匹配(括号)

    08黑马笔记之栈的应用 就近匹配 括号 思想 前提 使用栈的链式存储来实现 1 遇到左括号就放进栈中 再遇到右括号就将左括号从栈中删除 若栈中没有元素或者不是左括号 则说明右括号匹配失败 以上是判断右括号不匹配的 下面是判断左括号不匹配 2
  • pandas中DataFrame的修改元素值、缺失值处理、合并操作的方法

    实验目的 熟练掌握pandas中DataFrame的修改元素值 缺失值处理 合并操作的方法 实验原理 concat合并 pd concat objs axis 0 join outer join axes None ignore index
  • Qt Quick - Dial

    Qt Quick Dial使用总结 一 概述 二 使用 一 概述 Dial 表盘类似于音响或工业设备上的传统表盘旋钮 它允许用户在一个范围内指定一个值 像CircularGauge一样 Dial可以显示刻度来指示当前值 当一个合适的步长与t
  • centos7安装apt

    centos7安装apt 搜索并下载对应版本 rpmforge release 下载地址 https www rpmfind net linux rpm2html search php query rpmforge release 执行安装
  • 大型网站在架构上应当考虑哪些问题

    大型网站在架构上应当考虑哪些问题 分层 分层是处理任何复杂系统最常见的手段之一 将系统横向切分成若干个层面 每个层面只承担单一的职责 然后通过下层为上层提供的基础设施和服务以及上层对下层的调用来形成一个完整的复杂的系统 大型网站的软件系统也
  • 【Docker】Consul构建集群服务

    1 构建Docker Cousul集群服务 1 在 后输入mkdir consul命令 然后按Enter键 创建目录Consul 示例代码如下 mkdir consul ll 效果如图1所示 2 进入consul目录 在 后面输入cd co
  • 【WIN】【C++】遍历文件夹下所有文件

    遍历某一路径下的所有文件 主要用到的两个api是 findfirst和 findnext 接口已经封装好了 直接复制getAllFiles拿去用即可 封装接口 void getAllFiles string path vector
  • 测试人员代码走查基础要点

    代码走查 是测试人员了解代码逻辑 进行测试设计的重要环节 并且有很多bug并非需要到运行程序进行测试才能发现 通过合理的代码走查方法能提前发现相当多的BUG 除常见的业务逻辑与程序逻辑不符外 本文收集了在过往工作中的经常能发现BUG的走查要
  • Cookie:使用Cookie实现记住用户的账号和密码

    目录 练习一 java web jsp 中使用cookie记住用户的账号和密码 练习二 java web jsp servert 中使用cookie记住用户的账号和密码 进阶例题 java web中使用cookie记住用户的账号和密码 练习
  • JAVA之初识springMVC框架

    1 环境 操作系统 Mac OS 10 12 6 Tomcat v7 0 JDK 1 7 工具 eclipse 2 新建项目 用eclipse新建项目 选择Dynamic Web Project 将项目字符集改为UTF 8 3 编辑web
  • SpringBoot--基础--07--多线程

    SpringBoot 基础 07 多线程 一 方式1 1 1 代码和测试 TaskConfig package fei zhou springboot4 demo2 import java util concurrent Executor
  • PAT乙级(Bascic Level)1037(C++)

    1037 在霍格沃茨找零钱 20 如果你是哈利 波特迷 你会知道魔法世界有它自己的货币系统 就如海格告诉哈利的 十七个银西可 Sickle 兑一个加隆 Galleon 二十九个纳特 Knut 兑一个西可 很容易 现在 给定哈利应付的价钱P和
  • 【ES6】Set 和 Map 数据结构

    文章目录 前言 一 Set 1 用法详解 1 1 声明方式 1 2 遍历的四种方式 2 应用场景 2 1 数组去重 2 2 合并去重 2 3交集 2 4 差集 3 WeakSet 二 Map 1 用法详解 1 1 声明方式 1 2 遍历的四