js语法---map,set结构

        map和set是像对象和数组一样的数据结构集,内部可以按照一定的关系存放一串数据

map

        map是一个带键的数据项的集合,就像一个 Object 一样。 但是它们最大的差别是 Map 允许任何类型的键(key)。

它的方法和属性如下:

  • new Map() —— 创建 map。
  • map.set(key, value) —— 根据键存储值。
  • map.get(key) —— 根据键来返回值,如果 map 中不存在对应的 key,则返回 undefined
  • map.has(key) —— 如果 key 存在则返回 true,否则返回 false
  • map.delete(key) —— 删除指定键的值。
  • map.clear() —— 清空 map。
  • map.size —— 返回当前元素个数。

创建map

// 创建map对象
let m = new Map();m.set("name1","Tom");
m.set("name2","Jerry");
m.set("name3","shy");console.log(m);

        可以看到map像对象(object)一样key/value存放了数据,但是map保存了顺序(0,1,2)

m.set(1,"number").set(true,"boolean").set({type:"object"},"object");

 

        set()方法存放数据会返回给原来的map,所以我们可以链式的调用set方法;同时在map中键并不一定得是字符串类型,像数字和布尔类型,对象在map中并没有被转换而是被保留了下来,使用对象作为键是 Map 最值得注意和重要的功能之一。

遍历map

如果要在 map 里使用循环,可以使用以下三个方法:

  • map.keys() —— 遍历并返回一个包含所有键的可迭代对象,
  • map.values() —— 遍历并返回一个包含所有值的可迭代对象,
  • map.entries() —— 遍历并返回一个包含所有实体 [key, value] 的可迭代对象,for..of 在默认情况下使用的就是这个(map与 map.entries() 相同)。
// 遍历map
console.log("遍历所有的键-------------");
// 遍历所有的键
for (let key of map.keys()) {console.log(key);
}
console.log("遍历所有的值-------------");
// 遍历所有的值
for (let value of map.values()) {console.log(value);
}
console.log("遍历所有的实体-------------");
// 遍历所有的实体 [key, value]
for (let entry of map) { // 与 map.entries() 相同console.log(entry);
}
// 对每个键值对 (key, value) 运行 forEach 函数
map.forEach( (key,value) => {console.log(`${key}: ${value}`);
});

        map可以在new Map()的时候插入值---->当创建一个 Map 后,我们可以传入一个带有键值对的数组(或其它可迭代对象)来进行初始化,而迭代的顺序与插入值的顺序相同,即前面保存数据的时候保留的顺序。

map和对象

Object.entries:从对象创建 Map

let obj = {name : "Tom",age : 18
}
// Object.entries将对象转成键值对数组
let newMap = new Map(Object.entries(obj));
console.log(newMap);

 

        Object.entries将对象转成键值对数组,在构造成map

Object.fromEntries:从 Map 创建对象

// 创建map对象
let map = new Map([["key1",10],["key2",20],["key3",30]
]);
// Object.fromEntries将map转成对象
let newObj = Object.fromEntries(map);
console.log(newObj);

         Object.fromEntries将map转成对象,这里要注意对象中的键只能是字符,不能为其他类型数据(number,Boolean)

set

Set 是一个特殊的类型集合 —— “值的集合”(没有键),它的每一个值只能出现一次 ,这表示set不能有重复元素。

它的主要方法如下:

  • new Set(iterable) —— 创建一个 set,如果提供了一个 iterable 对象(通常是数组),将会从数组里面复制值到 set 中。
  • set.add(value) —— 添加一个值,返回 set 本身
  • set.delete(value) —— 删除值,如果 value 在这个方法调用的时候存在则返回 true ,否则返回 false
  • set.has(value) —— 如果 value 在 set 中,返回 true,否则返回 false
  • set.clear() —— 清空 set。
  • set.size —— 返回元素个数。

set像map的简化(只有值的map),继承的方法和map类似

创建set

// 创建一个set
let s = new Set([10,20]);
let obj = {name : "Tom",age : 18
}
s.add(obj).add("这是一个set");console.log(s);

 遍历set

Map 中用于迭代的方法在 Set 中也同样支持:

  • set.keys() —— 遍历并返回一个包含所有值的可迭代对象,
  • set.values() —— 与 set.keys() 作用相同,这是为了兼容 Map
  • set.entries() —— 遍历并返回一个包含所有的实体 [value, value] 的可迭代对象,它的存在也是为了兼容 Map
console.log("遍历set-------------");
// 遍历set
for (let value of s) console.log(value);
console.log("foreach-------------");
// foreach方法
s.forEach((value, valueAgain,set)=>{console.log(value,"===",valueAgain);
})

        set使用foreach方法时要注意,内部函数的参数value, valueAgain是一致的,相当于key等于value(set中不能有重复元素),

总结

Map —— 是一个带键的数据项的集合。

方法和属性如下:

  • new Map([iterable]) —— 创建 map,可选择带有 [key,value] 对的 iterable(例如数组)来进行初始化。
  • map.set(key, value) —— 根据键存储值,返回 map 自身。
  • map.get(key) —— 根据键来返回值,如果 map 中不存在对应的 key,则返回 undefined
  • map.has(key) —— 如果 key 存在则返回 true,否则返回 false
  • map.delete(key) —— 删除指定键对应的值,如果在调用时 key 存在,则返回 true,否则返回 false
  • map.clear() —— 清空 map 。
  • map.size —— 返回当前元素个数。

与普通对象 Object 的不同点:

  • 任何键、对象都可以作为键。
  • 有其他的便捷方法,如 size 属性。

Set —— 是一组唯一值的集合。

方法和属性:

  • new Set([iterable]) —— 创建 set,可选择带有 iterable(例如数组)来进行初始化。
  • set.add(value) —— 添加一个值(如果 value 存在则不做任何修改),返回 set 本身。
  • set.delete(value) —— 删除值,如果 value 在这个方法调用的时候存在则返回 true ,否则返回 false
  • set.has(value) —— 如果 value 在 set 中,返回 true,否则返回 false
  • set.clear() —— 清空 set。
  • set.size —— 元素的个数。

        在 Map 和 Set 中迭代总是按照值插入的顺序进行的,所以我们不能说这些集合是无序的,但是我们不能对元素进行重新排序,也不能直接按其编号来获取元素。

完整代码和运行结果

// 创建map对象
let m = new Map();// 传值
m.set("name1","Tom");
m.set("name2","Jerry");
m.set("name3","shy");
m.set(1,"number").set(true,"boolean").set({type:"object"},"object");console.log(m);// 创建map对象
let map = new Map([["key1",10],["key2",20],["key3",30]
]);
// 遍历map
console.log("遍历所有的键-------------");
// 遍历所有的键
for (let key of map.keys()) {console.log(key);
}
console.log("遍历所有的值-------------");
// 遍历所有的值
for (let value of map.values()) {console.log(value);
}
console.log("遍历所有的实体-------------");
// 遍历所有的实体 [key, value]
for (let entry of map) { // 与 map.entries() 相同console.log(entry);
}
console.log("foreach-------------");
// 对每个键值对 (key, value) 运行 forEach 函数
map.forEach( (key,value,map) => {console.log(`${key}: ${value}`);
});let obj = {name : "Tom",age : 18
}
// Object.entries将对象转成键值对数组
let newMap = new Map(Object.entries(obj));
console.log(newMap);
// Object.fromEntries将map转成对象
let newObj = Object.fromEntries(map);
console.log(newObj);// 创建一个set
let s = new Set([10,20]);
s.add(obj).add("这是一个set");console.log(s);console.log("遍历set-------------");
// 遍历set
for (let value of s) console.log(value);
console.log("foreach-------------");
// foreach方法
s.forEach((value, valueAgain,set)=>{console.log(value,"===",valueAgain);
})

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

后端方案设计文档结构模板可参考

文章目录 1 方案设计文档整体结构2 方案详细设计2.1 概要设计2.2 详细设计方案2.2.1 需求分析2.2.2 业务流程设计2.2.3 抽象类:实体对象建模2.2.4 接口设计2.2.5 存储设计 1 方案设计文档整体结构 一,现状:把项目的基本情况和背景都说清楚&a…

SpringCloud学习笔记(二)Ribbon负载均衡、Nacos注册中心、Nacos与Eureka的区别

文章目录 4 Ribbon负载均衡4.1 负载均衡原理4.2 源码解读4.3 负载均衡策略4.3.1 内置的负载均衡策略4.3.2 自定义负载均衡策略4.3.2.1 方式一:定义IRule4.3.2.2 方式二:配置文件 4.4 饥饿加载 5 Nacos注册中心5.1 认识和安装Nacos5.2 服务注册到Nacos5.3…

【linux-1-Ubuntu常用命令-vim编辑器-Vscode链接ubuntu远程开发】

目录 1. 安装虚拟机Vmare和在虚拟机上安装Ubuntu系统:2. 常用的Ubuntu常识和常用命令2.1 文件系统结构2.2 常用命令2.3 vim编辑器 3. Ubuntu能联网但是ping不通电脑:4. Windows上安装VScode链接ubuntu系统,进行远程开发: 1. 安装虚…

qt5-入门-2D绘图-Graphics View 架构

参考: Qt Graphics View Framework_w3cschool https://www.w3cschool.cn/learnroadqt/4mvj1j53.html C GUI Programming with Qt 4, Second Edition 本地环境: win10专业版,64位,Qt 5.12 基础知识 QPainter比较适合少量绘图的情…

【webrtc】MessageHandler 2: 基于线程的消息处理:以PeerConnectionClient为例

PeerConnectionClient 前一篇 nullaudiopoller 并么有场景线程,而是就是在当前线程直接执行的, PeerConnectionClient 作为一个独立的客户端,默认的是主线程。 PeerConnectionClient 同时维护客户端的信令状态,并且通过OnMessage实现MessageHandler 消息处理。 目前只处理一…

【分享】如何将word格式文档转化为PDF格式

在日常的办公和学习中,我们经常需要将Word文档转换为PDF格式。PDF作为一种通用的文件格式,具有跨平台、易读性高等优点,因此在许多场合下都更为适用。那么,如何实现Word转PDF呢?本文将介绍几种常用的方法,帮…

Aker(安碁科技)晶振产品应用和选型

一、石英晶体振荡器简介 在电子电路系统中,特定的动作需要严格按照一定的顺序进行,以确保数据被正确处理和操作,时钟信号就成了系统工作的重要引导者。而且在多模块复杂电路系统中,为了确保不同功能模块能协调一致地工作&#xf…

怎么用微信小程序实现远程控制台球室

怎么用微信小程序实现远程控制台球室呢? 本文描述了使用微信小程序调用HTTP接口,实现控制台球室,控制球台上方的照明灯,单台设备可控制多张球台的照明灯。 可选用产品:可根据实际场景需求,选择对应的规格 …

Matlab生成txt文件导入到Vivado仿真

Matlab处理数据并将其写入txt文件 %% Txt Generate pre_RS_datadec2bin(simDataIn,8); %将数据转化为8bit的二进制 fidfopen("F:\FPGA\Xilinx_vivado\project\dvbstestbench\dbvs\matlab\pre_RS_data.txt","wt"); for i1:n*nMessages %数据…

【webrtc】MessageHandler 1: 基于线程的消息处理:以10毫秒处理音频为例

基于m98 G:\CDN\rtcCli\m98\src\audio\null_audio_poller.h分发的消息由MessageHandler 类通过其抽象接口OnMessage 实现处理 NullAudioPoller NullAudioPoller 是一个处理audio的消息的分发器 poll 启动:

Mybatis-Plus扩展接口InnerInterceptor

InnerInterceptor 接口就是 MyBatis-Plus 提供的一个拦截器接口,用于实现一些常用的 SQL 处理逻辑,处理 MyBatis-Plus 的特定功能,例如PaginationInnerInterceptor、OptimisticLockerInnerInterceptor 等,都实现了 InnerInterceptor 接口,并添…

SpringCloud 学习笔记 —— 六、Ribbon:负载均衡(基于客户端)

SpringCloud 学习笔记 —— 一、背景-CSDN博客 SpringCloud 学习笔记 —— 二、微服务与微服务架构-CSDN博客 SpringCloud 学习笔记 —— 三、SpringCloud 入门概述-CSDN博客 SpringCloud 学习笔记 —— 四、SpringCloud Rest 学习环境搭建:服务提供者-CSDN博客 …