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

【JS】ES6新类型Map与Set

一、Map

Map 对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者原始值)都可以作为键或值。

描述

Map 对象是键值对的集合。Map 中的一个键只能出现一次;它在 Map 的集合中是独一无二的。
Map 对象按键值对迭代——一个 for…of 循环在每次迭代后会返回一个形式为 [key, value] 的数组。迭代按插入顺序进行,即键值对按 set() 方法首次插入到集合中的顺序(也就是说,当调用 set() 时,map 中没有具有相同值的键)进行迭代。

键是如何对比相等

键的比较基于零值相等算法。(它曾经使用同值相等,将 0 和 -0 视为不同。)这意味着 NaN 是与 NaN 相等的(虽然 NaN !== NaN),剩下所有其他的值是根据 === 运算符的结果判断是否相等。

基本使用

实例属性:size(Map长度)
实例方法:

  • Map.prototype.get():返回与指定的键 key 关联的值,若不存在关联的值,则返回 undefined。
  • Map.prototype.has():返回一个布尔值,用来表明 Map 对象中是否存在与指定的键 key 关联的值。
  • Map.prototype.keys():返回一个新的迭代器对象,其包含 Map 对象中所有元素的键,以插入顺序排列。
  • Map.prototype.set():在 Map 对象中设置与指定的键 key 关联的值,并返回 Map 对象。
  • Map.prototype.values():返回一个新的迭代对象,其中包含 Map 对象中所有的值,并以插入 Map 对象的顺序排列。
  • Map.prototype.clear():移除 Map 对象中所有的键值对。
  • Map.prototype.delete():移除 Map 对象中指定的键值对,如果键值对存在并成功被移除,返回 true,否则返回 false。调用 delete 后再调用 map.has(key) 将返回 false。
  • Map.prototype.entries():返回一个新的迭代器对象,其包含 Map 对象中所有键值对 [key, value] 二元数组,以插入顺序排列。
  • Map.prototype.forEach():以插入顺序为 Map 对象中的每个键值对调用一次 callbackFn。如果为 forEach 提供了 thisArg 参数,则它将作为每一次 callback 的 this 值。
  • Map.prototype [Symbol.iterator] () 返回一个新的迭代器对象,其包含 Map 对象中所有元素 [key, value] 二元数组,以插入顺序排列。
const myMap = new Map();const keyString = "a string";
const keyObj = {};
const keyFunc = function () {};// 添加键
myMap.set(keyString, "和键'a string'关联的值");
myMap.set(keyObj, "和键 keyObj 关联的值");
myMap.set(keyFunc, "和键 keyFunc 关联的值");console.log(myMap.size); // 3// 读取值
console.log(myMap.get(keyString)); // "和键'a string'关联的值"
console.log(myMap.get(keyObj)); // "和键 keyObj 关联的值"
console.log(myMap.get(keyFunc)); // "和键 keyFunc 关联的值"console.log(myMap.get("a string")); // "和键'a string'关联的值",因为 keyString === 'a string'
console.log(myMap.get({})); // undefined,因为 keyObj !== {}
console.log(myMap.get(function () {})); // undefined,因为 keyFunc !== function () {}

可迭代

const myMap = new Map();
myMap.set(0, "zero");
myMap.set(1, "one");for (const [key, value] of myMap) {console.log(`${key} = ${value}`);
}
// 0 = zero
// 1 = onefor (const key of myMap.keys()) {console.log(key);
}
// 0
// 1for (const value of myMap.values()) {console.log(value);
}
// zero
// onefor (const [key, value] of myMap.entries()) {console.log(`${key} = ${value}`);
}
// 0 = zero
// 1 = one

Map与数组

const kvArray = [["key1", "value1"],["key2", "value2"],
];// 使用常规的 Map 构造函数可以将一个二维的键值对数组转换成一个 Map 对象
const myMap = new Map(kvArray);console.log(myMap.get("key1")); // "value1"// 使用 Array.from 函数可以将一个 Map 对象转换成一个二维的键值对数组
console.log(Array.from(myMap)); // 输出和 kvArray 相同的数组// 更简洁的方法来做如上同样的事情,使用展开运算符
console.log([...myMap]);// 或者在键或者值的迭代器上使用 Array.from,进而得到只含有键或者值的数组
console.log(Array.from(myMap.keys())); // 输出 ["key1", "key2"]

复制Map

const original = new Map([[1, "one"]]);const clone = new Map(original);console.log(clone.get(1)); // one
console.log(original === clone); // false. 浅比较 不为同一个对象的引用

合并Map

Map 对象间可以进行合并,但是会保持键的唯一性。后面的会覆盖前面的。

const first = new Map([[1, "one"],[2, "two"],[3, "three"],
]);const second = new Map([[1, "uno"],[2, "dos"],
]);// 合并两个 Map 对象时,如果有重复的键值,则后面的会覆盖前面的。
// 展开语法本质上是将 Map 对象转换成数组。
const merged = new Map([...first, ...second]);console.log(merged.get(1)); // uno
console.log(merged.get(2)); // dos
console.log(merged.get(3)); // three

Map与数组合并

const first = new Map([[1, "one"],[2, "two"],[3, "three"],
]);const second = new Map([[1, "uno"],[2, "dos"],
]);// Map 对象同数组进行合并时,如果有重复的键值,则后面的会覆盖前面的。
const merged = new Map([...first, ...second, [1, "eins"]]);console.log(merged.get(1)); // eins
console.log(merged.get(2)); // dos
console.log(merged.get(3)); // three

与Object对比

MapObject
默认不包含任何键,只包含显示存入的键值对。键可以为任何值(包括函数、对象以及任何原始类型)Object有原型,所以包含默认的键。键类型必须为StringSymbol
大小size属性获取Object.keys().length
迭代可迭代没有迭代协议,不能通过for…of迭代
性能在涉及频繁添加和删除键值对的场景中表现更好未针对频繁添加和删除键值对进行优化

二、Set

Set 对象存储任何类型(无论是原始值还是对象引用)的唯一值。

描述

Set 对象是值的合集(collection)。集合(set)中的元素只会出现一次,即集合中的元素是唯一的。你可以按照插入顺序迭代集合中的元素。插入顺序对应于 add() 方法成功将每一个元素插入到集合中(即,调用 add() 方法时集合中不存在相同的元素)的顺序。

如何对比值的相等

值的相等是基于零值相等算法的。(曾使用会将 0 和 -0 视为不同值的同值算法。参见浏览器兼容性。)这意味着 NaN 和 undefined 会被视为是相同的值(即使 NaN !== NaN),而所有其他的值则基于 === 运算符的语义进行相等比较。

性能

has 方法检查某个值是否在集合中,其采用的方式的平均时间比逐个测试先前添加到集合中的元素更快。特别是当一个数组的长度(length)等于集合的大小(size)时,这比 Array.prototype.includes 方法的平均速度更快。

基本使用

实例属性:size(Map长度)

实例方法:

  • Set.prototype.add(): 在 Set 对象中插入一个新的具有指定值的元素。
  • Set.prototype.clear(): 从 Set 对象中移除所有元素。
  • Set.prototype.delete():移除与 value 关联的元素,并返回一个布尔值来表示是否移除成功。Set.prototype.has(value) 会在此之后返回 false。
  • Set.prototype.entries():返回一个新的迭代器对象,该对象包含 Set 对象中的代表每个元素的 [value, value] 数组。这与 Map 对象类似,因此 Set 的每个条目的 key 和 value 都相同。
  • Set.prototype.forEach():按照值插入的顺序为 Set 对象中的每个值调用一次 callbackFn。如果提供了 thisArg 参数,它将被用作每次调用 callbackFn 时的 this 值。
  • Set.prototype.has():返回一个布尔值,表示给定值在 Set 对象中是否存在。
  • Set.prototype.keys():Set.prototype.values() 的别名。
  • Set.prototype.values():返回一个新的迭代器对象,该对象按插入顺序生成 Set 对象中每个元素的值。
  • Set.prototype [Symbol.iterator] ():返回一个新的迭代器对象,该对象按插入顺序生成 Set 对象中每个元素的值。
const mySet1 = new Set();mySet1.add(1); // Set(1) { 1 }
mySet1.add(5); // Set(2) { 1, 5 }
mySet1.add(5); // Set(2) { 1, 5 }
mySet1.add("some text"); // Set(3) { 1, 5, 'some text' }
const o = { a: 1, b: 2 };
mySet1.add(o);mySet1.add({ a: 1, b: 2 }); // o 是不同对象的引用,所以这是可以的mySet1.has(1); // true
mySet1.has(3); // false,因为并未将 3 添加到集合中
mySet1.has(5); // true
mySet1.has(Math.sqrt(25)); // true
mySet1.has("Some Text".toLowerCase()); // true
mySet1.has(o); // truemySet1.size; // 5mySet1.delete(5); // 从集合中移除 5
mySet1.has(5); // false,5 已从集合中移除mySet1.size; // 4,因为我们刚刚移除了一个值mySet1.add(5); // Set(5) { 1, 'some text', {...}, {...}, 5 }——先前删除的元素会作为新的元素被添加,不会保留删除前的原始位置console.log(mySet1); // Set(5) { 1, "some text", {…}, {…}, 5 }

与数组的关系

const myArray = ["value1", "value2", "value3"];// 使用常规的 Set 构造函数将 Array 转换为 Set
const mySet = new Set(myArray);mySet.has("value1"); // 返回 true// 使用展开语法将 Set 转换为 Array。
console.log([...mySet]); // 将显示与 myArray 完全相同的数组

数组去重

// 用于从数组中删除重复元素
const numbers = [2, 3, 4, 4, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 5, 32, 3, 4, 5];console.log([...new Set(numbers)]); // [2, 3, 4, 5, 6, 7, 32]

零值相等算法

原本js中,NaN !== NaN,但是零值相等算法视为相等,-0 与 0也视作相等。

const set = new Set([NaN, NaN]);
console.log(set); // Set(1) {NaN}const set1 = new Set([0, -0]);
console.log(set1); // Set(1) {0}

与Array对比

SetArray
允许存储重复的值不允许存储重复的值。如果尝试向 Set 添加一个已经存在的值,该值将被忽略。
元素的类型判断使用严格相等(===)判断元素是否相等使用零值相等算法,类似于严格相等(===),但 NaN 被视为等于 NaN,-0 === 0。
性能在添加、删除和查找元素时具有更高的性能,特别是对于大量数据。处理大量数据不如Set

使用场景

Array:适用于需要存储有序且可能包含重复元素的数据的场景,如列表、队列、栈等。
Set:适用于需要存储唯一值的集合,如在需要检查是否包含某个值或需要快速去重时。

相关文章:

【JS】ES6新类型Map与Set

一、Map Map 对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者原始值)都可以作为键或值。 描述 Map 对象是键值对的集合。Map 中的一个键只能出现一次;它在 Map 的集合中是独一无二的。 Map 对象按键值对迭代——…...

FETCH FIRST ROW ONLY和 DISTINCT ON和 LIMIT 1的用法

以下是 PostgreSQL 中函数 FETCH FIRST ROW ONLY、DISTINCT ON 和 LIMIT 1 的用法、含义、例子以及适用版本的信息总结: FETCH FIRST ROW ONLY 用法和含义 FETCH FIRST ROW ONLY 用于限制查询结果集,只返回第一行。它可以和 ORDER BY 子句一起使用&am…...

前端小白安装node、vue、Express、Electron及(Electron桌面端exe应用开发)

一、node.js (一)、下载 下载地址 Node.js — 在任何地方运行 JavaScript (nodejs.org) 参考文章:Node.js安装及环境配置超详细教程【Windows系统】_windows 安装nodejs-CSDN博客 (二)、安装 安装路径可以更换&a…...

solidity多态【很重要】

多态是面向对象编程(OOP)的一个核心概念,允许不同类的对象被视为同一类型的实例,并根据实际类型来响应相同的方法调用。 这意味着同一个接口可以用来引用属于不同类的对象,而这些对象可以有自己的方法实现&#xff0c…...

Jangow-1.0.1靶机漏洞复现(未完成)

首先,这个靶机只能使用VirtualBox打开,靶机下载地址为 https://download.vulnhub.com/jangow/jangow-01-1.0.1.ova 虚拟机软件下载地址为 Download_Old_Builds – Oracle VM VirtualBox 开启靶机后访问ip进入如下页面,点击site进入到一个…...

软件测试--python基础

一、python基础 (1)第一个python (2)python解释器 (3)基础语法 ①字面量 什么是字面量 常用的值类型 字符串 ②注释 ③变量 什么是变量 变量的特征 变量的目的是存储运行过程的数据 存储的目的是为了:重复使用 ④数据类型 type()语句 变量有类型吗?…...

GPIO子系统

1. GPIO子系统视频概述 1.1 GPIO子系统的作用 芯片内部有很多引脚,这些引脚可以接到GPIO模块,也可以接到I2C等模块。 通过Pinctrl子系统来选择引脚的功能(mux function)、配置引脚: 当一个引脚被复用为GPIO功能时,我们可以去设…...

学会这个Python库,接口测试so easy

前言 我们在做接口测试时,大多数返回的都是json属性,我们需要通过接口返回的json提取出来对应的值,然后进行做断言或者提取想要的值供下一个接口进行使用。 但是如果返回的json数据嵌套了很多层,通过查找需要的词,就…...

Stable Diffusion4.8.7(Ai绘画)软件安装教程

软件下载 [名称]:Stable Diffusion4.8.7(Ai绘画) [大小]:16.52GB [语言]:简体中文 [安装环境]:Win11/Win10/Win8/Win7 [硬件要求]:CPU2.0GHz ,内存4G(或更高&#x…...

操作系统错误处理

错误处理 1、通过函数的返回值表示执行错误: // 返回合法值表示成功 返回非法值表示失败 // 计算大小、查找 long file_size(const char* path) {FILE* fp fopen(path,"r");if(NULL fp)return -1; // 返回非法值fseek(fp,SEEK_END,0);long size …...

【靶场实操】sql-labs通关详解----第一节:基础注入方式(Less-1~Less-10)

目录 一、注入方式简要概括 1.1 SQL常见注入方式 1.2 爆破函数 二、靶场实操 2.1 Less-1 2.1.1 判断类型 2.1.2 联合注入查询 2.2 Less-2 2.2.1 判断类型 2.2.2 注入攻击 2.2.3 字符型与数字型漏洞对比 2.3 Less-3 2.3.1 判断 2.3.2 注入 2.4 Less-4 2.4.1 判断…...

力扣676.实现一个魔法字典

力扣676.实现一个魔法字典 字典树 dfs class Trie{public:Trie* next[26];bool is_end false;};class MagicDictionary {public:Trie* root new Trie();void add(string& word){Trie* p root;for(char c:word){if(p->next[c-a] NULL) p->next[c-a] new Trie…...

ctfshow-web入门-sql注入(web171-web175)

目录 1、web171 2、web172 3、web173 4、web174 5、web175 1、web171 单引号测一下,报错 -- 闭合后回显正常 也可以用 # ,不过需要 URL 编码 成功闭合之后,先判断下字段数: 1 order by 3-- 3 的时候正常 4 的时候报错&am…...

视频怎么添加音乐?分享5种视频添加音乐方法

在如今火爆的短视频时代,为视频添加合适的背景音乐,无疑是让其脱颖而出的关键一步。无论是打造个人Vlog、纪录片,还是创意短片,音乐都能赋予视频独特的情感与氛围。那么怎么给视频添加上背景音乐呢?给大家分享5种简单的…...

黑马JavaWeb后端案例开发(包含所有知识点!!!)

目录 1.准备工作 环境搭建 开发规范 REST(REpresentation State Transfer),表述性状态转换,它是一种软件架构风格 注意事项 统一响应结果 2.部门管理功能 查询部门 删除部门 新增部门 RequestMapping 3.员工管理功能 分页查询 批…...

FPGA开发——蜂鸣器实现音乐播放器的设计

一、概述 我们在进行蜂鸣器的学习的时候,总会在想既然蜂鸣器能够发出声音,那么它能够播放音乐吗,今天这篇我们文章我们就一起来学习怎样使用使用蜂鸣器来播放音乐,也就是怎样成为一个音乐播放器。 1、蜂鸣器的类型 在设计的时候…...

InnoDB存储引擎(1)

InnoDB存储引擎的优点 InnoDB在设计时考虑到了处理大数据量时的性能,支持事务,回滚和崩溃修复的能力,通过多版本并发控制来减少锁定(降低了锁的争用),同时还支持外键的约束;通过缓冲池在内存中缓存数据来提高查询的性能&#xff…...

VMWare虚拟机共享主机的网络访问外网

1.主机中启动客户端并连接外网 2.设置虚拟网络类型为NAT 3.启动虚拟并通过主机访问外网...

LeetCode Easy|【415. 字符串相加】

力扣题目链接 题目本身难度不大,但是后续的一些补充内容还是值得搞清楚的 主要的逻辑如下: 其实本题的目的就是让我们来模拟我们的竖式加法。所以很直观的一个想法就是使用双指针:分别指向两个 num 的末尾。随后就会产生一些问题&#xff1a…...

RAG 革命:NVIDIA 工作站如何成为企业 AI 的秘密武器

在深圳的一家科技初创公司,首席技术官李梅正在向她的团队展示一个令人兴奋的新项目。“看这个,” 她指着屏幕上的实时演示说,“我们刚刚用公司的技术文档训练了一个 AI 助手,它现在可以回答任何关于我们产品的问题,而且…...

九大原则,轻松构建个人高效SOP

1、原则一、工作汇报SOP SCQA模型(升职加薪的关键!) 清晰定义问题和提出解决方案 类别 关键词 解读 S - Situation 情景 陈述项目背景,目标,愿景 C - Complication 冲突 讲卡点,讲冲突 Q - Question 疑问-问题 这些冲…...

Airtest的demo实现多设备并行

Airtest的demo实现多设备并行 它实现是的获取adb连接上的所有设备,然后在每一台设备上跑给定的测试用例,跑完之后生成单机的测试报告,最后再汇总这些单机测试报告的结果,形成汇总(聚合)报告: 同…...

社区养老服务小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,服务人员管理,服务产品管理,服务预约管理,服务状态管理,服务退订管理,活动管理,视频管理 微信端账号功能包…...

Interceptor拦截器开发

因为1登录后的接口都需要token验证代码,会出现重复代码;2当前的接口不防刷,会被恶意攻击 所以在controller层增加请求拦截,如果你的token不合法,就不让你做后续的处理了 拦截器的作用是什么 作用: 1、对controller层代码的访问进行拦截,合法的请求,那此层代码就处理,反…...

美团 AIGC产品经理面经(已拿 offer)

背景:211本科毕业,毕业之后在北京一家中型电商公司做了3年商家后台产品经理,目前通过老薛的朋友关系拿到了美团的offer。 目前还有几家在面试流程中,继续加油💪 美团AIGC产品面经-业务面 💥1、自我介绍&a…...

@RequestBody与@RequestParam

RequestBody会将请求体中的数据,转换成对象.最主要的是RequestBody就是要返回Json的字符串!!! RequestParam会从http请求查询参数中提取数据! RequestParam和RequestBody是Spring Framework中用于处理HTTP请求的注解…...

vmware上,虚机经常丢失网卡。导致无法上网。

1、winR 输入 services.msc 2、重启这两个服务。 VMware NAT service和VMware DHCP service...

git 鉴权失败

这条错误信息通常出现在使用Git进行远程操作时,比如克隆仓库、拉取更新或推送代码。错误的含义是: HTTP Basic: Access denied:访问被拒绝。The provided password or token is incorrect:提供的密码或令牌不正确。Your account …...

[C++] 容器适配器:深入理解Stack与Queue的底层原理

文章目录 容器适配器简介deque的缺陷为什么使用deque作为stack和queue的底层默认容器 stack和queue的简单讲解Stack(栈)栈的操作图示栈的相关接口 Queue(队列) Stack和Queue的模拟实现Stack(栈)作为容器适配…...

Eclipse maven 的坑

在使用 eclipse 时, eclipse 的右下角 一直在提示 “JPA java change event handler” ,eclipse使用起来很卡,解决办法 问题描述: 在使用 eclipse时, eclipse 的右下角 一直在提示 “JPA java change event handler”…...

企业建设银行网站登录不了/北京优化网站公司

【数据结构实战C】6 算法效率的度量 作者 CodeAllen &#xff0c;转载请注明出处 常见的时间复杂度 常见时间复杂度的比较 O&#xff08;1&#xff09;< O&#xff08;logn&#xff09;<O&#xff08;n&#xff09;<O&#xff08;n*logn&#xff09;<O&#xff08…...

企业网站建设 安全/关键词提取工具app

el-tree初始化的时候默认选中第一个 先查看https://cloud.tencent.com/developer/section/1489888按照以上方法能不能解决 首先设置node-key 然后设置default-expanded-keys <template><div class"system-tree"><el-tree :data"data" …...

php网站后台搭建/安卓优化大师官方下载

iPhone12 mini、iPhone12、iPhone12 Pro、iPhone12 Pro Max四款手机&#xff0c;屏幕尺寸分别为5.4英寸、6.1英寸、6.1英寸、6.7英寸。采用OLED屏幕&#xff0c;多年不变的刘海屏设计。综合各方面这次iPhone12将不会有高刷新率。 iphone手机爆降2500 这活动太给力了机会不容错过…...

网站开发论坛/百度总部

CSS left 属性 CSS 参考手册 实例 把图像的左边缘设置在其包含元素左边缘向右 100 像素的位置&#xff1a; img{position:absolute;left:100px;}亲自试一试 浏览器支持 所有主流浏览器都支持 left 属性。 注释&#xff1a;任何的版本的 Internet Explorer &#xff08;包括 IE8…...

网站的建设费用分为/武汉网络营销公司排名

目录 1 数据库的设计 1.1 多表之间的关系 1.2 数据库设计的范式 2 数据库的备份与还原 1 数据库的设计 数据库中存放很多表&#xff0c;设计数据库就是设计表&#xff0c;而表就是对现实事物的抽象&#xff0c;设计数据库&#xff0c;需要明白表的关系&#xff0c;也要知道…...

云浮 网站建设/微信朋友圈广告投放代理

真的没想到随手写的一篇小笔记会引起那么多关注&#xff0c;真是瑟瑟发抖。读研之后&#xff0c;才开始接触pytorch, 理解的难免有很多错误&#xff0c;感谢各位大佬指出的错误和提出的意见&#xff0c;我会慢慢修改的。评论区有大佬说nvidia的apex.distributeddataparallel也是…...