【JavaScript】`Map` 数据结构

文章目录

    • 一、`Map` 的基本概念
    • 二、常见操作
    • 三、与对象的对比
    • 四、实际应用场景

在现代 JavaScript 中,Map 是一种非常重要且强大的数据结构。与传统的对象(Object)不同,Map 允许您使用各种类型的值作为键,不限于字符串或符号。这为开发者提供了更多的灵活性和效率。本文将详细介绍 Map 的基本概念、用法、常见操作以及与对象的对比,帮助您全面掌握这一数据结构。

一、Map 的基本概念

Map 是一种键值对集合,其中键和值都可以是任意类型。Map 保留了键值对的插入顺序,且键是唯一的,这意味着在同一个 Map 中,键不能重复。

创建一个 Map

可以使用 Map 构造函数来创建一个新的 Map 实例:

const map = new Map();

也可以通过传入一个二维数组来初始化 Map,数组中的每个元素都是一个包含两个值的数组,分别表示键和值:

const map = new Map([['key1', 'value1'],['key2', 'value2']
]);

二、常见操作

添加和获取元素

可以使用 set 方法添加键值对,使用 get 方法获取对应键的值:

const map = new Map();
map.set('name', 'Alice');
map.set('age', 25);console.log(map.get('name')); // 输出: Alice
console.log(map.get('age')); // 输出: 25

检查键是否存在

可以使用 has 方法检查 Map 中是否存在某个键:

console.log(map.has('name')); // 输出: true
console.log(map.has('address')); // 输出: false

删除元素

可以使用 delete 方法删除某个键值对,使用 clear 方法删除所有键值对:

map.delete('age');
console.log(map.has('age')); // 输出: falsemap.clear();
console.log(map.size); // 输出: 0

获取键值对数量

可以使用 size 属性获取 Map 中键值对的数量:

console.log(map.size); // 输出: 2

遍历 Map

Map 提供了多种遍历方法,可以使用 for...of 循环或内置的遍历方法如 keysvaluesentries

const map = new Map([['name', 'Alice'],['age', 25]
]);for (let [key, value] of map) {console.log(`${key}: ${value}`);
}
// 输出:
// name: Alice
// age: 25for (let key of map.keys()) {console.log(key);
}
// 输出:
// name
// agefor (let value of map.values()) {console.log(value);
}
// 输出:
// Alice
// 25for (let [key, value] of map.entries()) {console.log(`${key}: ${value}`);
}
// 输出:
// name: Alice
// age: 25

三、与对象的对比

尽管 Map 和对象在某些方面类似,但它们在使用场景和性能上有一些显著区别。

键的类型

对象的键只能是字符串或符号,而 Map 的键可以是任意类型,包括对象、函数、基本类型等:

const obj = {};
const map = new Map();obj['key'] = 'value';
map.set('key', 'value');obj[{}] = 'value'; // 键会被转换为字符串 '[object Object]'
map.set({}, 'value'); // 键是对象的引用

遍历顺序

Map 按照插入顺序保留键值对,而对象的键的遍历顺序可能会根据不同的 JavaScript 引擎有所不同。

性能

对于频繁增删键值对的操作,Map 通常比对象更高效。对象适用于结构化的静态数据,而 Map 更适合需要动态操作的场景。

四、实际应用场景

缓存

Map 可以用于缓存数据,以提高应用程序的性能:

const cache = new Map();function fetchData(key) {if (cache.has(key)) {return cache.get(key);} else {const data = getDataFromAPI(key); // 假设这是一个从 API 获取数据的函数cache.set(key, data);return data;}
}

计数

Map 适合用于对数据进行计数,如统计字符出现的次数:

const charCount = new Map();
const str = 'hello world';for (let char of str) {if (charCount.has(char)) {charCount.set(char, charCount.get(char) + 1);} else {charCount.set(char, 1);}
}console.log(charCount);
// 输出: Map { 'h' => 1, 'e' => 1, 'l' => 3, 'o' => 2, ' ' => 1, 'w' => 1, 'r' => 1, 'd' => 1 }

推荐我的相关专栏:

  • python 错误记录
  • python 笔记
  • 数据结构

在这里插入图片描述

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

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

相关文章

mysql 如何实现重复数据取创建时间的最后一条记录?

重复数据去重,取创建时间最晚的一条。 思路:按重复的字段通过group by 去重,重复的数据通过GROUP_CONCAT()函数收集,再通过SUBSTRING_INDEX()函数截取即可。 实例: SELECTUserName,//字段值按…

基于 HTML+ECharts 实现监控平台数据可视化大屏(含源码)

构建监控平台数据可视化大屏:基于 HTML 和 ECharts 的实现 监控平台的数据可视化对于实时掌握系统状态、快速响应问题至关重要。通过直观的数据展示,运维团队可以迅速发现异常,优化资源配置。本文将详细介绍如何利用 HTML 和 ECharts 实现一个…

关于 夜莺n9e 的简易部署

一、部署夜莺n9e 1.找一个服务器机器 #创建并进入目录 mkdir -p /data/n9e && cd /data/n9e2.准备n9e安装包 (如果存在,跳过) #下载并解压n9e wget https://download.flashcat.cloud/n9e-v6.7.3-linux-amd64.tar.gz tar -zxvf n9e-v6.7.3-linux-amd64.ta…

SecureCRT连接Linux时乱码问题

使用SecureCRT输入中文出现乱码的问题,通常与字符编码和终端的显示设置有关. 发生乱码的原因主要是有三个地方 1.Linux的etc的系统默认配置的编码 2.用户环境变量里面设置的LANG变量 3.SecureCRT会话变量里面的字符集的设置 只要保持这三个地方的字条集编码保持一致…

学习笔记7:gitlab ci/cd

gitlab ci/cd GitLab CI/CD 是 GitLab 提供的持续集成和持续部署工具。它是一种自动化的流程,用于在软件开发过程中自动构建、测试和部署应用程序。以下是 GitLab CI/CD 的一些关键特性和概念: 持续集成(Continuous Integration, CI&#xf…

JL 跳转指令的理解

一般情况下,JU 和 JC 是最常见的跳转指令;但有时会用到JL 指令,JL 说起来更像是一组指令,类似C,C# 语言中的 switch case 语句,但是有个明显的不同,前者的判断条件可以是任意合理数字,后者范围…

制冷系统干燥过滤器

干燥过滤器(Drier Filter)主要是起到杂质过滤的作用。一般来说,这要根据冰箱、空调的制冷系统来确定干燥器的规格,如直径,内径,外径的规格,和内部件,如过滤碗,网布,和分子筛 为了确保…

C#测试控制台程序调用Quartz.NET的基本用法

Quartz.Net是常用的任务调用框架之一,既能在客户端程序中使用,也支持在网页程序后台调用。本文结合参考文献4中的示例代码学习其在控制台程序中的基本用法。   VS2022新建控制台项目,在Nuget包管理器中搜索并安装Quartz包,如下所…

JavaWeb笔记_JSPEL

一.JSP相关技术 1.1 JSP由来 当我们需要向页面输出大量的HTML代码的时候,我们需要通过response对象写多次来输出HTML代码 response.getWriter().write("<font>文本</font>"); 页面的展示和servlet密不可分,不利于后期代码维护,因此推出一种可以…

npm下载pnpm

一、提供node_global和node_cache的文件夹 若不存在&#xff0c;可自行新建文件夹 二、配置环境变量 配置NODE_PATH变量&#xff1a; 配置Path变量&#xff1a; 三、执行cmd指令 npm config set prefix "D:\Configure\nodejs\node_global" npm config set cache &…

[Python][运算符]详细讲解

目录 1.算数运算符2.关系运算符3.逻辑运算符4.赋值运算符1.的使用2.复合赋值运算符 5.其他 1.算数运算符 算术运算符&#xff1a;像 - * / % ** //这种进行算术运算的运算符 先算乘方&#xff0c;然后是乘除&#xff0c;最后算甲酸如果运算过程中想修改默认的运算顺序&#xf…

公司邮箱一般是什么邮箱

公司邮箱一般是什么邮箱呢&#xff1f;公司邮箱是企业官方通信工具&#xff0c;体现专业形象&#xff0c;提高协作效率。选择时需考虑安全性、功能集成、性价比和技术支持。Zoho邮箱因简洁界面、丰富协作工具和出色安全性能受好评&#xff0c;提供多种套餐选择。 一、公司邮箱…

【Go - sync.once】

sync.Once 是 Go 语言标准库中的一个结构体&#xff0c;它的作用是确保某个操作在全局范围内只被执行一次。这对于实现单例模式或需要一次性初始化资源的场景非常有用。 典型用法 sync.Once 提供了一个方法 Do(f func())&#xff0c;该方法接收一个没有参数和返回值的函数 f …

vue3中父子组件的双向绑定defineModel详细使用方法

文章目录 一、defineProps() 和 defineEmits()二、defineModel() 的双向绑定2.1、基础示例2.2、定义类型2.3、声明prop名称2.4、其他声明2.5、绑定多个值2.6、修饰符和转换器2.7、修饰符串联 一、defineProps() 和 defineEmits() 组件之间通讯&#xff0c;通过 props 和 emits…

编写SpringBoot的自定义starter包

starter项目 先来看一下Starter的官方解释&#xff1a; Spring Boot Starter 是一种方便的依赖管理方式&#xff0c;它封装了特定功能或技术栈的所有必要依赖项和配置&#xff0c;使得开发者可以快速地将这些功能集成到Spring Boot项目中。Spring Boot官方提供了一系列的Star…

接入百度文心一言API教程

然后&#xff0c;编辑文章。点击AI识别摘要&#xff0c;然后保存即可 COREAIPOWER设置 暂时只支持经典编辑器.古腾堡编辑器等几个版本后支持.在比期间,你可以自己写点摘要 摘要内容 AL识别摘要 清空 若有收获&#xff0c;就点个赞吧 接入文心一言 现在百度文心一言&…

vsftpd搭建FTP服务器 - 虚拟用户

命令记录 $ sudo apt install vsftpd db-util $ sudo nano /etc/vsftpd.conf $ sudo nano /etc/vsftpd/vsftpd-virtual-users.txt $ sudo db_load -T -t hash -f /etc/vsftpd/vsftpd-virtual-users.txt /etc/vsftpd/vsftpd-virtual-users.db ls /etc/vsftpd/vsftpd-virtual-us…

目标检测YOLO实战应用案例100讲-【目标检测】结构光

目录 前言 知识储备 前置摄像头3D结构光、TOF,双目立体视觉 3D传感系统的种类 TOF应用前景广阔 TOF供应链梳理 算法原理 1 红外发射器 2 不可见光红外线(IR)接收模组 3 可见光摄像头 4 图像处理芯片 结构光分类 1. 线扫描结构光 2. 面阵结构光 应用案例 2D线扫…

IDEA的pom.xml显示ignored 的解决办法

问题&#xff1a; idea中创建Maven module时&#xff0c;pom.xml出现ignored。 原因&#xff1a; 相同名称的module在之前被创建删除过&#xff0c;IDEA会误以为新的同名文件是之前删除掉的&#xff0c;将这个新的module的pom.xml文件忽略掉显示ignored. 解决&#xff1a; 在…

看 Unity 组件的源码 —— ILSpy

ILSpy 是开源的 .NET 程序集浏览器和解编译器。 下载 ILSpy ILSpy Github 地址&#xff1a;icsharpcode/ILSpy: .NET Decompiler with support for PDB generation, ReadyToRun, Metadata (&more) - cross-platform! (github.com) 它有 Release 包可以下载 也提供 IDE 的…