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

前端面试八之map

Map 是 JavaScript 中的一个内置对象,它是一种键值对的集合,类似于对象(Object),但有一些重要的区别和优势。Map 提供了更强大的功能,特别是在处理键值对时更加灵活和高效。

1. Map 的基本特性

(1)键值对
  • Map 是一个简单的键值对集合,其中每个键都映射到一个值。

  • 键可以是任何数据类型(包括对象、函数等),而不仅仅是字符串或符号(Symbol)。

  • 值也可以是任何数据类型。

(2)保持插入顺序
  • Map 会按照插入的顺序保存键值对。这意味着当你遍历 Map 时,键值对会按照插入的顺序返回。

(3)动态大小
  • Map 的大小是动态的,可以根据需要添加或删除键值对。

2. 创建 Map

可以通过以下方式创建一个 Map

const myMap = new Map();

 也可以通过一个数组的数组(键值对数组)初始化 Map

const myMap = new Map([['key1', 'value1'],['key2', 'value2'],[3, 'value3'],[{ id: 1 }, 'value4'],
]);

3. Map 的常用方法

(1)set(key, value):添加或更新键值对

(2)保持插入顺序

(3)动态大小

2. 创建 Map

可以通过以下方式创建一个 Map

JavaScript

复制

const myMap = new Map();

也可以通过一个数组的数组(键值对数组)初始化 Map

JavaScript

复制

const myMap = new Map([['key1', 'value1'],['key2', 'value2'],[3, 'value3'],[{ id: 1 }, 'value4'],
]);

3. Map 的常用方法

(1)set(key, value):添加或更新键值对

JavaScript

复制

myMap.set('key1', 'newValue1');
myMap.set('key3', 'value3');
(2)get(key):获取键对应的值

JavaScript

复制

console.log(myMap.get('key1')); // 输出: newValue1
console.log(myMap.get('key3')); // 输出: value3
console.log(myMap.get('key4')); // 输出: undefined
(3)has(key):检查键是否存在

JavaScript

复制

console.log(myMap.has('key1')); // 输出: true
console.log(myMap.has('key4')); // 输出: false
(4)delete(key):删除键值对

JavaScript

复制

console.log(myMap.delete('key1')); // 输出: true
console.log(myMap.delete('key4')); // 输出: false
(5)clear():清空所有键值对

JavaScript

复制

myMap.clear();
(6)size:获取键值对的数量

JavaScript

复制

console.log(myMap.size); // 输出: 0(如果已经调用了 clear)

4. 遍历 Map

Map 提供了多种遍历方式,包括 for...of 循环、forEach 方法等。

(1)for...of 循环

(2)性能

(3)保持顺序

(4)内置方法

  • 如果键已存在,则更新其值。

  • 如果键不存在,则添加新的键值对。

    myMap.set('key1', 'newValue1');
    myMap.set('key3', 'value3');
    (2)get(key):获取键对应的值
  • 如果键存在,返回对应的值。

  • 如果键不存在,返回 undefined

    console.log(myMap.get('key1')); // 输出: newValue1
    console.log(myMap.get('key3')); // 输出: value3
    console.log(myMap.get('key4')); // 输出: undefined
    (3)has(key):检查键是否存在
  • 如果键存在,返回 true

  • 如果键不存在,返回 false

    console.log(myMap.has('key1')); // 输出: true
    console.log(myMap.has('key4')); // 输出: false
    (4)delete(key):删除键值对
  • 如果键存在,删除键值对并返回 true

  • 如果键不存在,返回 false

    console.log(myMap.delete('key1')); // 输出: true
    console.log(myMap.delete('key4')); // 输出: false
    (5)clear():清空所有键值对
  • 删除 Map 中的所有键值对。

    myMap.clear();
    (6)size:获取键值对的数量
  • 返回 Map 中的键值对数量。

    console.log(myMap.size); // 输出: 0(如果已经调用了 clear)

    Map 是 JavaScript 中的一个内置对象,它是一种键值对的集合,类似于对象(Object),但有一些重要的区别和优势。Map 提供了更强大的功能,特别是在处理键值对时更加灵活和高效。

    1. Map 的基本特性

    (1)键值对
  • Map 是一个简单的键值对集合,其中每个键都映射到一个值。

  • 键可以是任何数据类型(包括对象、函数等),而不仅仅是字符串或符号(Symbol)。

  • 值也可以是任何数据类型。

  • Map 会按照插入的顺序保存键值对。这意味着当你遍历 Map 时,键值对会按照插入的顺序返回。

  • Map 的大小是动态的,可以根据需要添加或删除键值对。

  • 如果键已存在,则更新其值。

  • 如果键不存在,则添加新的键值对。

  • 如果键存在,返回对应的值。

  • 如果键不存在,返回 undefined

  • 如果键存在,返回 true

  • 如果键不存在,返回 false

  • 如果键存在,删除键值对并返回 true

  • 如果键不存在,返回 false

  • 删除 Map 中的所有键值对。

  • 返回 Map 中的键值对数量。

  • 遍历 Map 的键值对。

    const myMap = new Map([['key1', 'value1'],['key2', 'value2'],
    ]);for (const [key, value] of myMap) {console.log(key, value);
    }
    // 输出:
    // key1 value1
    // key2 value2
    (2)forEach 方法
  • 遍历 Map 的键值对。

    myMap.forEach((value, key) => {console.log(key, value);
    });
    // 输出:
    // key1 value1
    // key2 value2
    (3)keys()values() 和 entries() 方法
  • keys():返回一个包含所有键的迭代器。

  • values():返回一个包含所有值的迭代器。

  • entries():返回一个包含所有键值对的迭代器。

    for (const key of myMap.keys()) {console.log(key);
    }
    // 输出:
    // key1
    // key2for (const value of myMap.values()) {console.log(value);
    }
    // 输出:
    // value1
    // value2for (const [key, value] of myMap.entries()) {console.log(key, value);
    }
    // 输出:
    // key1 value1
    // key2 value2

    5. Map 与 Object 的区别

    (1)键的类型
  • Object:键只能是字符串或符号(Symbol)。

  • Map:键可以是任何数据类型(包括对象、函数等)。

  • Object:在处理大量数据时,性能可能会下降,尤其是在频繁添加和删除键值对时。

  • Map:在处理大量数据时性能更好,尤其是在频繁添加和删除键值对时。

  • Object:不保证键的顺序。

  • Map:按照插入顺序保存键值对,遍历时会按照插入顺序返回。

  • Object:没有内置的 size 属性或 clear 方法。

  • Map:提供了 size 属性和 clear 方法。

  • Object:没有内置的 size 属性或 clear 方法。

  • Map:提供了 size 属性和 clear 方法。

6. 使用场景

Map 适用于以下场景:

  • 需要存储键值对,且键的类型不局限于字符串或符号。

  • 需要频繁添加和删除键值对。

  • 需要保持键值对的插入顺序。

  • 需要高效地遍历键值对。

7. 示例:使用 Map 处理三级下拉框数据

以下是一个完整的示例,展示如何在 Vue 2 中使用 Map 处理三级下拉框的数据。

 数据结构

const data = [{id: 1,name: '省份1',cities: [{id: 11,name: '城市1-1',areas: [{ id: 111, name: '区域1-1-1' },{ id: 112, name: '区域1-1-2' },],},{id: 12,name: '城市1-2',areas: [{ id: 121, name: '区域1-2-1' },{ id: 122, name: '区域1-2-2' },],},],},{id: 2,name: '省份2',cities: [{id: 21,name: '城市2-1',areas: [{ id: 211, name: '区域2-1-1' },{ id: 212, name: '区域2-1-2' },],},{id: 22,name: '城市2-2',areas: [{ id: 221, name: '区域2-2-1' },{ id: 222, name: '区域2-2-2' },],},],},
];

 Vue 组件

<template><div><h1>三级下拉框示例</h1><el-selectv-model="selectedProvince"placeholder="请选择省份"@change="onProvinceChange"><el-optionv-for="province in data":key="province.id":label="province.name":value="province.id"></el-option></el-select><el-selectv-model="selectedCity"placeholder="请选择城市"@change="onCityChange":disabled="!selectedProvince"><el-optionv-for="city in provinceMap.get(selectedProvince)?.cities":key="city.id":label="city.name":value="city.id"></el-option></el-select><el-selectv-model="selectedArea"placeholder="请选择区域"@change="onAreaChange":disabled="!selectedCity"><el-optionv-for="area in cityMap.get(selectedCity)?.areas":key="area.id":label="area.name":value="area.id"></el-option></el-select></div>
</template><script>
export default {data() {return {data, // 原始数据provinceMap: new Map(), // 省份 MapcityMap: new Map(), // 城市 MapselectedProvince: null, // 选中的省份selectedCity: null, // 选中的城市selectedArea: null, // 选中的区域};},created() {this.initializeMaps();},methods: {initializeMaps() {// 初始化省份 Mapthis.data.forEach(province => {this.provinceMap.set(province.id, province);province.cities.forEach(city => {this.cityMap.set(city.id, city);});});},onProvinceChange(provinceId) {this.selectedProvince = provinceId;this.selectedCity = null;this.selectedArea = null;},onCityChange(cityId) {this.selectedCity = cityId;this.selectedArea = null;},onAreaChange(areaId) {this.selectedArea = areaId;},},
};
</script>

代码解释

(1)initializeMaps 方法
  • created 钩子中调用 initializeMaps 方法。

  • 将省份和城市的数据分别存储到 provinceMapcityMap 中。

  • 这样可以快速通过省份 ID 获取省份数据,通过城市 ID 获取城市数据。

(2)onProvinceChange 方法
  • 当省份发生变化时,更新 selectedProvince

  • 清空城市和区域的选择,因为省份变化后,城市和区域的选择需要重新选择。

(3)onCityChange 方法
  • 当城市发生变化时,更新 selectedCity

  • 清空区域的选择,因为城市变化后,区域的选择需要重新选择。

(4)onAreaChange 方法
  • 当区域发生变化时,更新 selectedArea

(5)模板中的动态绑定
  • 使用 v-model 绑定选中的省份、城市和区域的 ID。

  • 使用 v-for 动态生成下拉框的选项。

  • 使用 :disabled 属性控制下拉框的启用状态,确保只有在选中上一级时才能选择下一级。

效果

运行项目后,你将看到一个包含三级下拉框的页面。选择省份后,城市下拉框会动态更新;选择城市后,区域下拉框会动态更新。

 

总结

通过使用 Map 处理三级下拉框的数据,可以实现高效的级联选择功能。这种方式不仅代码清晰,而且性能优越,特别适合处理复杂的数据结构。

http://www.xdnf.cn/news/14078.html

相关文章:

  • NGINX SSL/TLS 预读模块解密 ngx_stream_ssl_preread_module 实战指南
  • 编译器基础概念
  • libcuckoo 介绍和使用指南
  • Spring源码本地编译并执行测试
  • 安卓手机解压软件推荐:高效处理各种压缩文件
  • 问答播放器(视频弹题)使用例子(代码)
  • Linux拼接/etc/passwd和/etc/shadow下的用户列
  • ImageSharp.Web 使用指南:高效处理ASP.NET Core中的图像
  • 油猴攻略:解锁浏览器无限可能
  • Python基础之函数(1/3)
  • 在 Windows 11 上,必须开启网络代理才能上网,关闭代理后无法访问互联网
  • JVM GC 问题排查实战案例
  • SQL注入部分理论入门学习
  • 列举开源的模型和推理框架
  • CSS a标签内文本折行展示
  • NoETL 指标平台:语义驱动数据治理的升维战
  • 网络原理:网段划分
  • 看PDF文献用什么软件比较好?高效文献阅读工具推荐
  • Elasticsearch 批量创建索引实践与优化建议
  • vue中的三种插槽方式
  • file文件生成hash值
  • LeetCode 704.二分查找
  • gbase8s之MyBatis批量update问题
  • 中科院1区|IF10+:加大医学系团队利用GPT-4+电子病历分析,革新肝硬化并发症队列识别
  • 轻量级密码算法LED的C语言实现(无第三方库)
  • Ubuntu 24.04.2 LTS Python 人工智能Ai视觉模型
  • 使用php对navicat查看数据库密码?
  • 漏洞(网络空间安全真相)
  • 开源模型应用落地-工具使用篇-从零开始搭建Qdrant Web UI-可视化管理工具-Windows(十)
  • Linux 中 “/dev/null” 有什么作用 ?