【JavaScript】`Map` 数据结构
创始人
2024-11-19 07:07:41
0

文章目录

    • 一、`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')); // 输出: false  map.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: 25  for (let key of map.keys()) {   console.log(key); } // 输出: // name // age  for (let value of map.values()) {   console.log(value); } // 输出: // Alice // 25  for (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 笔记
  • 数据结构

在这里插入图片描述

相关内容

热门资讯

透视辅助!wepoker有人用... 透视辅助!wepoker有人用过吗(透视)辅助修改器(有挂解密)-哔哩哔哩1、wepoker有人用过...
第一分钟了解!家乡大二辅助,雀... 第一分钟了解!家乡大二辅助,雀友圈斗地主有挂,策略教程(真是有挂)-哔哩哔哩1、该软件可以轻松地帮助...
第五分钟了解!哈局十三张通用辅... 第五分钟了解!哈局十三张通用辅助!好像真的有辅助插件(新版有挂)-哔哩哔哩1、这是跨平台的哈局十三张...
透视黑科技!心悦提坑神器软件下... 透视黑科技!心悦提坑神器软件下载,博雅红河西元红河挂-确实是有辅助神器(哔哩哔哩)1、心悦提坑神器软...
透视了解!wepoker轻量版... 透视了解!wepoker轻量版书签(透视)辅助修改器(有挂方针)-哔哩哔哩运wepoker轻量版书签...
两分钟了解!佛手在线辅助,新挑... 两分钟了解!佛手在线辅助,新挑战辅助脚本,积累教程(有挂教程)-哔哩哔哩新挑战辅助脚本辅助器是一种具...
第3分钟了解!桂麻圈辅助器试用... 第3分钟了解!桂麻圈辅助器试用方法!好像真的有辅助工具(有挂解惑)-哔哩哔哩第3分钟了解!桂麻圈辅助...
第三方辅助!微信微乐辅助插件,... 第三方辅助!微信微乐辅助插件,创思维激k辅助下载-一直确实有辅助挂(哔哩哔哩)1、首先打开创思维激k...
于此同时!德普之星辅助器app... 于此同时!德普之星辅助器app(透视)辅助平台(有挂方法)-哔哩哔哩1、任何德普之星辅助器app透视...
第二分钟了解!捉住捣蛋鸡作z弊... 第二分钟了解!捉住捣蛋鸡作z弊码,小程序跑得快的辅助,教材教程(有挂教学)-哔哩哔哩小薇(辅助器软件...