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

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]

相关文章:

  • 基于深度学习的消费物联网中安全音乐流量传输方法
  • 【Redis系列】Redis安装与使用
  • 负载均衡集群——LVS-DR配置
  • 区块链账户的概念与安全管理
  • 在nodejs中使用RabbitMQ(七)实现生产者确认
  • SCI学术论文图片怎么免费绘制:drawio,gitmind
  • ES 与 MySQL 数据同步:深入解析与实战拓展
  • Qt的QListWidget样式设置
  • sql注入
  • 机器视觉--Halcon If语句
  • 小胡说技书博客分类(部分目录):服务治理、数据治理与安全治理对比表格
  • IM相关资料整理
  • 基于SSM+uniapp的鲜花销售小程序+LW示例参考
  • 【Go并发编程】Goroutine 调度器揭秘:从 GMP 模型到 Work Stealing 算法
  • 一款基于若依的wms系统
  • Mybatisplus-IService
  • 零基础学习人工智能
  • 体验 DeepSeek-R1:解密 1.5B、7B、8B 版本的强大性能与应用
  • Spring安装和使用(Eclipse环境)
  • 分布式事务框架--Seata(AT模式)的原理
  • 巴基斯坦称成功拦截印度导弹,空军所有资产安全
  • 人民日报刊文:守护“技术进步须服务于人性温暖”的文明底线
  • 赵作海因病离世,妻子李素兰希望过平静生活
  • 图忆|红场阅兵:俄罗斯30年来的卫国战争胜利日阅兵式
  • 青年与人工智能共未来,上海创新创业青年50人论坛徐汇分论坛举办
  • 重温经典|《南郭先生》:不模仿别人,不重复自己