当前位置: 首页 > news >正文

ES6中的map和set

Map

JS的数据对象(Obejct),本质上是键值对的集合(Hash结构),但是传统上只能用字符串当作键(一定程度上对其的使用有限制)

比如下面代码

const data = {}
const element = document.getElementById('myDiv')data[element] = 'metaData'
data['[object HTMLDivElement]'] // "metadata"

上面代码原意是将一个 DOM 节点作为对象data的键,但是由于对象只接受字符串作为键名,所以element被自动转为字符串[object HTMLDivElement]

“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。(Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。)

如果需要“键值对”的数据结构,Map 构造函数比 Object 更合适。

具有极快的查找速度

在n中有很长的数据,但是利用Map则查找十分迅速:

const m=new map(['Kris',21],['Bob',19],['Lily',25],['Jack',27]);
m.get('Kris');   //  21
m.get('Lily');   //  25

初始化Map需要一个二维数组,或者直接初始化一个空Map,

let m=new Map();
//-----------------------
const m=new map(['Kris',21],['Bob',19],['Lily',25],['Jack',27]);
m.get('Kris');   //  21
m.get('Lily');   //  25

Map的方法

Map方法说明
set(key, val):向Map中添加新元素
get(key):通过键值查找特定的数值并返回
has(key):判断Map对象中是否有Key所对应的值,有返回true,否则返回false
delete(key):通过键值从Map中移除对应的数据
clear():将这个Map中的所有元素删除

一个key只能对应一个value,所以多次对一个key放入value,后面的值会把前面的值冲掉

Set

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

Set本身是一个构造函数,用来生成 Set 数据结构。

以下代码

const s = new Set();[2, 3, 5, 4, 5, 2, 2].forEach(x => s.add(x));for (let i of s) {console.log(i);
}
// 2 3 5 4

结果表明 Set 结构不会添加重复的值

向Set中加入值不会发生类型转换,所以5"5"是两个不同的值。

前面说到set结构不会添加重复的值意味着set内部会对值进行判断,使用的判断算法叫“Same-value-zero equality”,类似于精确相等符(===),但主要的区别是向Set加入值时认为NaN等于自身,而精确相等符认为NaN不等于自身

所以下面例子中Set里面只有一个NaN

let set = new Set();
let a = NaN;
let b = NaN;
set.add(a);
set.add(b);
set // Set {NaN}

另外两个对象总是不相等的

Array.from()方法可以将Set结构转为数组

所以去重(数组或者字符串)成员可以使用set

[...new Set(array)]
[...new Set('ababbc')].join('')
Array.from(new Set(array));

Set的方法

Set方法说明
add添加某个值,但会Set结构本身
delete删除某个值,返回一个布尔值,表示是否成功
has返回一个布尔值,表示该值是否为Set的成员。
clear清除所有成员,没有返回值。

WeakSet

http://www.lryc.cn/news/504062.html

相关文章:

  • UE5中实现Billboard公告板渲染
  • 泊松编辑 possion editing图像合成笔记
  • #渗透测试#漏洞挖掘#红蓝攻防#SRC漏洞挖掘
  • 系列2:基于Centos-8.6Kubernetes 集成GPU资源信息
  • Coturn 实战指南:WebRTC 中的 NAT 穿透利器
  • 基于卷积神经网络的Caser算法
  • 自闭症在学校:了解自闭症的特点,优化学校教育方式
  • 多线程的知识总结(8):用 thread 类 或全局 async (...) 函数,创建新线程时,谁才是在新线程里第一个被执行的函数
  • ArcGIS地理空间平台manager存在任意文件读取漏洞
  • HarmonyOS Next 元服务新建到上架全流程
  • 【Linux】makefile项目管理
  • Lumos学习王佩丰Excel第二十一讲:经典Excel动态图表实现原理
  • Linux框架(二)——pinctrl和gpio子系统
  • C++ string的基本概念
  • MAC虚拟机上安装WDA环境
  • 与 Cursor AI 对话编程:2小时开发报修维修微信小程序
  • leetcode-73.矩阵置零-day5
  • CSS学习记录13
  • CAD图纸加密软件哪个最好用 | 安全可靠的解决方案
  • 基于SSM+Vue的宠物医院管理系统
  • 处理VUE框架中,ElementUI控件u-table空值排序问题
  • 专业140+总分400+北京理工大学826信号处理导论考研经验北理工电子信息与通信工程,真题,大纲,参考书。
  • Rocky DEM tutorial5_Drop Weight test_落锤试验
  • C#,在 C# 语言中将 LaTeX 转换为 PNG 或 JPG 图像
  • Elasticsearch:Mapping-映射
  • 安装Tensorflow@FreeBSD(失败)
  • API接口示例:电商商品评论数据
  • 使用idea创建一个JAVA WEB项目
  • 解决MyBatis在 Oracle 中使用 IN 语句不能超过 1000 问题
  • 最长递增子序列两种算法实现(动态规划,二分查找)