【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 笔记
  • 数据结构

在这里插入图片描述

相关内容

热门资讯

透视辅助!哈糖大菠萝免费辅助器... 透视辅助!哈糖大菠萝免费辅助器,sohoo辅助,详细开挂辅助平台(透视有挂技术);无需打开直接搜索加...
必备辅助推荐“约局吧是否有挂”... 您好:这款游戏是可以开挂的,确实是有挂的,很多玩家在这款游戏中打牌都会发现很多用户的牌特别好,总是好...
透视辅助!sohoopoker... 透视辅助!sohoopoker辅助,wepoker透视破解版,原来有开挂辅助平台(透视证实有挂)>>...
玩家亲测“哈糖大菠萝挂”开挂(... 玩家亲测“哈糖大菠萝挂”开挂(透视)辅助安装(大神讲解有挂方式);无需打开直接搜索微信(136704...
透视辅助!aapoker脚本,... 透视辅助!aapoker脚本,智星德州可以透视吗,原来有开挂辅助插件(透视讲解有挂);无需打开直接搜...
研究成果“wepoker辅助透... 【亲,wepoker辅助 这款游戏可以开挂的,确实是有挂的,很多玩家在这款wepoker辅助中打牌都...
透视辅助!拱趴大菠萝万能挂,w... 您好:拱趴大菠萝万能挂这款游戏可以开挂的,确实是有挂的,很多玩家在这款游戏中打牌都会发现很多用户的牌...
每日必看“wepoker破解是... 每日必看“wepoker破解是真的还是假的”开挂(透视)辅助神器(wpk教程有挂教学);无需打开直接...
透视辅助!aa poker辅助... 您好:这款hhpoker有没有辅助游戏是可以开挂的,确实是有挂的,很多玩家在这款hhpoker有没有...
透视插件“aapoker破解侠... 透视插件“aapoker破解侠是真的吗”开挂(透视)辅助插件(曝光教程有挂总结) >>您好:软件加薇...