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

JavaScript中Map和Set数据结构详解

目录

一、Map

1. 定义与特点

2. 创建Map对象

3. 常用方法

4. 遍历Map

5. Map与对象的区别

二、Set

1. 定义与特点

2. 创建Set对象

3. 常用方法

4. 遍历Set

5. 应用场景

数据去重

集合运算

遍历集合


一、Map

1. 定义与特点

Map 是 JavaScript ES6 中新增的一种数据结构,它类似于对象,但比对象更强大、更灵活。Map是一种键值对集合,可以存储任意类型的键和值,与普通对象不同,Map保留了键的原始插入顺序,并支持链式调用。Map的键可以是任何类型的数据,包括对象和函数。

2. 创建Map对象

  • 使用new Map()构造函数

  • 使用字面量语法

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

3. 常用方法

  • 添加键值对set(key, value)

  • 获取键对应的值get(key)

  • 检查键是否存在has(key)

  • 删除键值对delete(key)

  • 清空Mapclear()

  • 获取Map大小size

 map.set('key1', 'value1');
 console.log(map.get('key1')); // 输出: value1
 console.log(map.has('key1')); // 输出: true
 map.delete('key1');
 map.clear();
 console.log(map.size); // 输出: 0(当前Map中键值对的数量)

4. 遍历Map

Map提供了多种遍历方法:

  • forEach():遍历Map中的每个键值对,接受一个回调函数。

  • for...of方法:keys() :返回一个包含所有键的迭代器,values() :返回一个包含所有值的迭代器,entries() :返回一个包含所有键值对的迭代器。

 const map = new Map([['key1', 'value1'], ['key2', 'value2']]);
 ​
 // 使用 forEach 方法遍历
 map.forEach((value, key) => {
     console.log(key, value);
 });
 ​
 // 使用 for...of 循环遍历
 for (let [key, value] of map) {
     console.log(key, value);
 }
 ​
 // 使用 keys()、values() 和 entries() 方法遍历
 for (let key of map.keys()) {
     console.log(key);
 }
 ​
 for (let value of map.values()) {
     console.log(value);
 }
 ​
 for (let [key, value] of map.entries()) {
     console.log(key, value);
 }

5. Map与对象的区别

特性Map对象
键的类型可以是任何数据类型,包括对象、函数、基本类型等只能是字符串或符号类型
键的顺序按插入顺序保留键值对键的遍历顺序可能会根据不同的 JavaScript 引擎有所不同
大小属性size 属性,可以直接获取键值对的数量没有内置的 size 属性,需要手动计算
迭代方式可直接迭代,使用 for...of 循环或 forEach 方法需要先获取键数组,然后进行迭代
默认键没有默认键继承自 Object.prototype,可能会有默认键
性能在频繁增删键值对的操作中通常比对象更高效适用于结构化的静态数据
序列化/解析没有内置的序列化或解析支持,但可以自定义实现可以使用 JSON.stringifyJSON.parse 进行序列化和解析
创建方式使用 new Map() 构造函数或传递可迭代对象初始化使用字面量语法 {} 或构造函数 new Object() 创建
方法提供 set, get, has, delete, clear, keys, values, entries 等方法提供 hasOwnProperty, in 运算符等方法

二、Set

1. 定义与特点

Set 也是 JavaScript ES6 中新增的一种数据结构,它类似于数组,但成员的值都是唯一的,没有重复的值。Set内部通过哈希算法保证元素的唯一性和快速查找。

2. 创建Set对象

  • 使用new Set()构造函数

  • 使用字面量语法

 const set = new Set();
 const set = new Set([1, 2, 3, 4]);

3. 常用方法

  • 添加元素add(value)

  • 删除元素delete(value)

  • 检查元素是否存在has(value)

  • 清空Setclear()

  • 获取Set大小size

 set.add(5);
 set.delete(5);
 console.log(set.has(5)); // 输出: false
 set.clear();
 console.log(set.size); // 输出: 0(当前Set中元素的数量)

4. 遍历Set

Set提供了多种遍历方法:

  • forEach():遍历Set中的每个元素,接受一个回调函数。

  • for...of方法:keys():返回一个包含所有元素的迭代器(Set本身就是无序的,因此keys()values()返回的结果相同),values():返回一个包含所有元素的迭代器,entries():返回一个包含所有键值对的迭代器(Set中没有键,因此返回的结果与values()相同)。

 const set = new Set([1, 2, 3, 4]);
 ​
 // 使用 forEach 方法遍历
 set.forEach((value) => {
     console.log(value);
 });
 ​
 // 使用 for...of 循环遍历
 for (let value of set) {
     console.log(value);
 }
 ​
 // 使用 values()、keys() 和 entries() 方法遍历
 for (let value of set.values()) {
     console.log(value);
 }
 ​
 for (let key of set.keys()) {
     console.log(key);
 }
 ​
 for (let [key, value] of set.entries()) {
     console.log(key, value);
 }

5. 应用场景

数据去重

Set对象的一个核心用途是去除重复值。当需要从数组中移除重复项时,可以使用Set来实现。

 const numbers = [1, 2, 3, 4, 5, 5, 6, 6, 6];
 const uniqueNumbers = new Set(numbers);
 console.log(uniqueNumbers); // 输出: Set {1, 2, 3, 4, 5, 6}

这种用法在处理数据时非常常见,特别是在需要确保集合中元素唯一性的情况下。

集合运算

Set对象支持多种集合运算,包括交集、并集和差集。

 const setA = new Set([1, 2, 3]);
 const setB = new Set([3, 4, 5]);
 const intersection = new Set([...setA].filter(x => setB.has(x)));
 console.log(intersection); // 输出: Set {3}

通过这些运算,可以方便地对集合进行数学上的操作。

遍历集合

Set对象提供了多种方法来遍历集合中的元素,例如forEach()values()keys()等,这些方法使得遍历和操作集合更加灵活。

 const set = new Set([1, 2, 3]);
 set.forEach(value => console.log(value));
 ​
 const values = Array.from(set.values());
 console.log(values); // 输出: [1, 2, 3]
 ​
 const keys = Array.from(set.keys());
 console.log(keys); // 输出: [1, 2, 3]

http://www.kler.cn/a/544020.html

相关文章:

  • TUSB422 MCU 软件用户指南
  • 网络安全-攻击路径
  • 在Mac arm架构终端中运行 corepack enable yarn 命令,安装yarn
  • 视频理解新篇章:Mamba模型的探索与应用
  • xtuner微调internlm2-chat-1_8b--xtuner中文文档快速上手案例
  • Vim操作笔记
  • Gitlib 企业本地部署
  • docker compose部署flink集群
  • 盛铂科技SWFA100捷变频频率综合器:高性能国产射频系统的关键选择
  • Vue前端开发-Pinia其他扩展插件
  • android 安装第三方apk自动赋予运行时权限
  • OSPF高级特性(3):安全特效
  • 【Java并发编程之如何在线程中安全地访问一个全局Boolean类型的静态变量?】
  • 详解spotbugs -textui常用命令(包括生成html测试报告)
  • Vue.js 响应式原理与数据绑定
  • 4. React 中的 CSS
  • Visual Studio 中的键盘快捷方式
  • 【Leetcode 每日一题】1760. 袋子里最少数目的球
  • 【C++学习笔记】if 和 if constexpr
  • Openssl的使用,CA证书,中间证书,服务器证书的生成与使用
  • 如何设计一个高效、稳定的秒杀系统?
  • 【AI】增长迅猛的DeepSeek
  • 《qt+easy3d 网格读取》
  • [Do374]ansible-nagivator考前整理
  • 探索边缘计算网关在优化交通信号控制中的关键角色
  • 【C】链表算法题7 -- 环形链表||