JavaScript ES6 全新的Set、Map数据结构

JavaScript ES6 全新的Set、Map数据结构

Map、Set都是ES6新的数据结构, 都是新的内置构造函数, 也就是说typeof的结果, 多了两个:

Set 是不能重复的数组, 但不能某一项来枚举出来

Map 是可以任何东西当做键的对象

set()数据结构

ES6 提供了新的数据结构 Set。它类似于数组, 但是成员的值都是唯一的, 没有重复的值。

复制代码
let s = new Set();
s.add(1);
s.add(2);
s.add(3);
s.add(3);
s.add(3);
s.add(4);
s.add(5);
console.log(s) //Set { 1, 2, 3, 4, 5, 6 }

集合中添加数据用add()方法, 会自动过滤已经有的元素。

最快的数组去重方法, 转化为数组:

复制代码
let s = new Set([1,2,3,3,3,4,5]);
console.log([...s]) //[ 1, 2, 3, 4, 5 ]
let s = new Set([1,2,3,4,5]);
console.log(s.size) // 5
console.log(s.has(5)) // true
console.log(s.delete(5)) // true
console.log(s) // Set { 1, 2, 3, 4 }

集合的关注点是在元素里面, 而不关注顺序, 所以不提供s0来枚举某项API, 但是可以转为数组...s

Map()数据结构

JavaScript 的对象(Object), 本质上是键值对的集合(Hash 结构), 但是传统上只能用字符串当作键。这给它的使用带来了很大的限制。

为了解决这个问题, ES6 提供了 Map 数据结构。它类似于对象, 也是键值对的集合, 但是"键"的范围不限于字符串, 各种类型的值(包括对象)都可以当作键。

也就是说, Object 结构提供了"字符串---值"的对应, Map 结构提供了"值---值"的对应, 是一种更完善的 Hash 结构实现。如果你需要"键值对"的数据结构, Map 比 Object 更合适。

复制代码
let m = new Map();
const o = {a:1,b:2};
m.set("haha", 123);
m.set(o, 456)
m.set(888,789)
console.log(m)
console.log(m.get(o)) //使用get()方法根据key获取对应的value
console.log(m.size) //获取对应的value数量

使用get()来得到元素的值, key是区分类型的。

遍历数据结构

使用for of 遍历数据结构

复制代码
let m = new Map();
m.set('a', 100)
m.set('b', 200)
m.set('c', 300)
//遍历key
for(let key of m.keys()){
console.log(key);
}
//遍历value
for(let value of m.values()){
console.log(value);
}

for...of遍历key 和 value

复制代码
let m = new Map();
m.set('a', 100)
m.set('b', 200)
m.set('c', 300)
for(let [key,value] of m){
console.log(key, value);
}

对象转数组

Array.from()方法用于将两类对象转为真正的数组:类似数组的对象和可遍历的对象(包括 ES6 新增的数据结构 Set 和 Map)。

复制代码
let m = new Map()
m.set('a', 100)
m.set('b', 200)
m.set('c', 300)
console.log(Array.from(m)) //将m转换为正常的数组
console.log(Array.from(m.keys())) //将m的键名转换为正常的数组
console.log(Array.from(m.values())) //将m的键值转换为正常的数组
相关推荐
运维行者_7 小时前
网络监控工具怎么选?从设备监控到智能运维的能力清单
运维·服务器·开发语言·网络·人工智能·支持向量机·php
review445437 小时前
拿到 codex 第一步
前端·agent·vibecoding
鶴哥只手遮天8 小时前
jQuery 4.0 源码架构与工程实践-第 01 章 · 全景与工程结构:一个 20 岁库的自省
前端·javascript·jquery
徐小夕8 小时前
doc2docx方案,开源!
前端·vue.js·github
徐小夕8 小时前
JitOFD:一款面向信创与档案场景的 Web 端 OFD 编辑器
前端·vue.js·github
“AI国潮设计-小江”8 小时前
【AIGC实战】Python+SDXL打造“潮汕英歌舞IP”万能立牌插件,批量生成“发财元宝蛋糕”视觉营销方案(附源码)
开发语言·人工智能·python·prompt·aigc
孟健9 小时前
Kimi K3.1 Pro 编程实测:3个月27万行代码,每年1.7万预算下如何9分钟修好顽固Bug
前端·开源·ai编程
lhbweilai9 小时前
分析FreeRTOS内核对象API的源码实现(八)
c语言·开发语言·stm32·单片机
努力努力再努力wz9 小时前
【C++高阶系列】C++20 协程底层原理:函数为什么能暂停?从状态机到 Task,彻底串起挂起、恢复与协程调度
开发语言·c++·c++20·1024程序员节
inksci9 小时前
在线编辑表格,功能强大,json互转
前端·javascript·html