ES6: set和map数据结构以及使用场景

ES6:set和map数据结构

  • 一、Set 数据结构:
  • 二、使用场景:使用Set 进行去重
  • 三、Map 数据结构
  • 四、使用场景:使用Map进行树型数据懒加载刷新
  • 五、Set和Map的区别
  • 六、Map、Set的实际使用场景

  • Set 和 Map 是 ES6 中引入的两种新的数据结构,用于存储和管理数据。它们可以处理唯一性需求、键值对需求、去重需求等,适用于许多实际场景,如数据过滤、数据映射、缓存管理
  • Set 和 Map 是JavaScript的对象,本质上是对键值对的集合(Hash结构)。

一、Set 数据结构:

Set 是一种有序且唯一的集合,它的值可以是任何类型。
Set 中的值是不重复的,重复的值将被自动去重。

常见的 Set 的属性如下:

  • size: 返回 Set 中的元素个数。

常见的 Set 的方法如下:

  • add(value): 向 Set 中添加一个值。
  • delete(value): 删除 Set 中指定的值。
  • has(value): 检查Set 中是否包含指定的值。
  • clear(): 清空 Set 中的所有元素
let demoSet=new Set();
demoSet.add("张三")
demoSet.add(18)
demoSet.add(81)
demoSet.add("张三")// 重复不会添加console.log(demoSet.size);// 2
console.log(demoSet);// Set(3) {'张三', 18, 81}
console.log(demoSet.has("张三"));// true
console.log(demoSet.delete(81));// true
demoSet.clear();
console.log(demoSet);//Set(0) {size: 0}

常见的 Set 的遍历方法如下:

  • keys():返回一个包含集合中所有键的数组;
  • values():返回一个包含集合中所有值的数组;
  • entries:返回一个包含集合中所有键值对的数组(感觉没什么用就不实现了) ;
  • forEach():用于对集合成员执行某种操作,没有返回值
let demoSet = new Set(["张三",18,81]);
console.log("keys",demoSet.keys());// SetIterator {'张三', 18, 81}
console.log("values",demoSet.values());// SetIterator {'张三', 18, 81}

二、使用场景:使用Set 进行去重

let tempArr=[1,4,5,5,4,5,7,8,3,2,6,7];
// 封装一个方法
function unique(arr) {var newArr = []var myset = new Set(arr) //利用了Set结构不能接收重复数据的特点for (let val of myset) {newArr.push(val)}return newArr
}
console.log(unique(tempArr));//[1, 4, 5, 7, 8, 3, 2, 6]// 简单写法
console.log([...new Set(tempArr)]);// [1, 4, 5, 7, 8, 3, 2, 6]// 方法三
let arr = ["a","b","c","c","d"];
let set = new Set(arr);
let newArr = Array.from(set);
console.log(newArr);// ['a', 'b', 'c', 'd']

三、Map 数据结构

Map 是一种用于存储键值对的有序列表,其中的键唯一且值可以是任意类型。

常见的 Map操作方法如下:
set(key, value): 向 Map 中添加一个键值对。
get(key): 获取指定键的值。
delete(key): 删除指定键的键值对。
has(key): 检查 Map 中是否包含指定的键。
size: 返回 Map 中键值对的数量。
clear(): 清空 Map 中所有的键值对。

let demoMap=new Map();
demoMap.set("name","张三")
demoMap.set("age",18)
demoMap.set("age2",81)console.log(demoMap.get("name"));// 张三
console.log(demoMap.has("age"));// true
console.log(demoMap.delete("age2"));// true
console.log(demoMap.size);// 2
console.log(demoMap);// Map(2) {'name' => '张三', 'age' => 18}
demoMap.clear();
console.log();// Map(0) {size: 0}	

四、使用场景:使用Map进行树型数据懒加载刷新

在这里插入图片描述
在增删改后需要重新刷新节点数据。

  <el-tree style="max-width: 600px" :props="props" :load="loadNode" lazy>

load:加载子树数据的方法,仅当 lazy 属性为true 时生效 function(node, resolve, reject)

const props = {label: 'name',children: 'children',isLeaf: 'leaf',
}
let pid="";
let treeNode=new Map();
const tempArr=[{pid:"-1",name: 'leaf',leaf:true},{pid:"-1",name: 'zone',},];
const loadNode = (node, resolve) => {pid="-1"treeNode=treeNode.set(pid,{node,resolve});if (node.level === 0) {return resolve([{ name: 'region' ,id:"-1"}])}if (node.level > 0) {return resolve(tempArr)}}
const refresh=()=>{const {node,resolve}=treeNode.get(pid)loadNode(node,resolve)
}
const onAdd=()=>{setTimeout(() => {refresh();}, 500)
}

五、Set和Map的区别

Map是一种键值对的集合,其中键和值可以是任意类型的。它的使用场景包括需要存储键值对并需要快速查找的场景,比如存储对象之间的关联关系、缓存数据等。

Set是一组唯一值的集合,适用于需要存储唯一值并需要快速查找的场景,比如数据去重、存储一组唯一的用户标识等。

六、Map、Set的实际使用场景

一些常见的开源库充分利用了 Map 和 Set 提供的高效数据结构来提升性能和功能实现:

· React : React 内部使用 Map 来存储组件的属性,这有助于快速查找和更新组件的属性。
· Vue . js : Vue . js 在其响应式系统中使用了 Map 来跟踪依赖关系,以便在数据变化时能够快速更新相关的视图。
· Redux : Redux 是一个流行的状态管理库,它在内部使用了 Map 来存储状态树,以便快速查找和更新状态。
· Lodash : Lodash 是一个 JavaScript 实用工具库,它在许多地方使用了 Map 和 Set 来提供高效的数据处理和操作。
.D3.js:D3.js是一个数据可视化库,它使用 Set 来管理数据的唯一性,以及使用 Map 来存储数据映射关系,例如数据和图形元素之间的对应关系。

//在 React 中,内部使用 Map 来存储组件的属性
const componentProps = new Map ();
function setComponentProps ( component , props ){componentProps.set(component , props );
}
function getComponentProps ( component ){ return componentProps.get( component );
}
//在D3.js中,使用 Set 来管理数据的唯一性
const uniqueData = new Set ();
function addDataToSet ( data ){uniqueData.add ( data );
}
function isDataUnique ( data ){return uniqueData . has ( data );
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/814486.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript中的Blob、Buffer、ArrayBuffer和TypedArray详解

文章的更新路线&#xff1a;JavaScript基础知识-Vue2基础知识-Vue3基础知识-TypeScript基础知识-网络基础知识-浏览器基础知识-项目优化知识-项目实战经验-前端温习题&#xff08;HTML基础知识和CSS基础知识已经更新完毕&#xff09; 正文 摘要&#xff1a;本文详细介绍了JavaS…

(UDP)其他信息: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。

“System.Net.Sockets.SocketException”类型的异常在 mscorlib.dll 中发生&#xff0c;但未在用户代码中进行处理其他信息: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。这个异常表示端口已经被占用了&#xff0c;需要释放端口或者使用其他端口来建立连接。您可以…

vite+react+ts+scss 创建项目

npm create vitelatest输入项目名称选择react选择typescript swc WC 通过利用 Rust 编写的编译器&#xff0c;使用了更先进的优化技术&#xff0c;使得它在处理 TypeScript 代码时能够更快地进行转换和编译。特别是在大型项目中&#xff0c;SWC 相对于传统的 TypeScript 编译器…

springboot火车运输物资定额领用管理系统java

本系统设计的现状和趋势&#xff0c;从需求、结构、数据库等方面的设计到系统的实现&#xff0c;分别为管理员和库房部、财务部、用户、生产部的实现。论文的内容从系统的设计、描述、实现、分析、测试方面来表明开发的过程。本系统根据现实情况来选择一种可行的开发方案&#…

2023数据要素白皮书(免费下载)

【1】关注本公众号&#xff0c;转发当前文章到微信朋友圈 【2】私信发送 【2023年数据资源入表白皮书】 【3】获取本方案PDF下载链接&#xff0c;直接下载即可。 如需下载本方案PPT原格式&#xff0c;请加入微信扫描以下方案驿站知识星球&#xff0c;获取上万份PPT解决方案&a…

STM32-看门狗

1、看门狗是什么&#xff1a;就是一个向下定时器&#xff0c;定时时间一到&#xff0c;就会触发一个向下的复位的中断&#xff0c;使单片机开始工作 2、作用&#xff1a;MCU微控制器构成的微型计算机系统中&#xff0c;由于微控制器的工作常常会受到来自外界电磁场的干 扰,造成…

MySQL进阶-合

目录 1.使用环境 2.条件判断 2.1.case when 2.2.if 3.窗口函数 3.1.排序函数 3.2.聚合函数 3.3.partiton by ​​​​​​​3.4.order by 4.排序窗口函数 5.聚合窗口函数 1.使用环境 数据库&#xff1a;MySQL 8.0.30 客户端&#xff1a;Navicat 15.0.12 MySQL进阶…

openjudge_2.5基本算法之搜索_166:The Castle

题目 166:The Castle 总时间限制: 1000ms 内存限制: 65536kB 描述 Figure 1 shows the map of a castle.Write a program that calculates how many rooms the castle hashow big the largest room is The castle is divided into m * n (m<50, n<50) square modules.…

React 组件生命周期对比:Class vs. 函数式

在 React 中&#xff0c;Class 组件和函数式组件的生命周期存在一些差异。通过对 React 中 Class 组件和函数式组件的生命周期进行对比&#xff0c;详细探讨了它们在设计哲学、生命周期管理和开发技巧上的异同。全面了解 React 中两种组件类型的生命周期特点&#xff0c;以及如…

MySQL-触发器:触发器概述、触发器的创建、查看删除触发器、 触发器的优缺点

触发器 触发器1. 触发器概述2. 触发器的创建2.1 创建触发器语法2.2 代码举例 3. 查看、删除触发器3.1 查看触发器3.2 删除触发器 4. 触发器的优缺点4.1 优点4.2 缺点4.3 注意点 注&#xff1a;此为笔者学习尚硅谷-宋红康MySQL的笔记&#xff0c;其中包含个人的笔记和理解&#…

Matlab与ROS(1/2)---Simulink(二)

0. 简介 在上一章中我们详细介绍了ROS与Matlab链接的基础用法。这一章我们将来学习如何使用Matlab当中的Simulink来完成。Simulink对机器人操作系统(ROS)的支持使我们能够创建与ROS网络一起工作的Simulink模型。ROS是一个通信层&#xff0c;允许机器人系统的不同组件以消息的形…

前端HTML入门基础5(表单)

前端HTML入门基础5&#xff08;表单&#xff09; 表单-基本结构文本框和密码框单选框和复选框隐藏域确认按钮重置按钮普通按钮文本域下拉框禁用表单控件label标签fieldset与legend的使用 表单-基本结构 在HTML中&#xff0c;表单&#xff08;Forms&#xff09;是一种允许用户与…

嵌入式实时操作系统的调度机制与优化

大家好&#xff0c;今天给大家介绍嵌入式实时操作系统的调度机制与优化&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 嵌入式实时操作系统的调度机制与优化 一、引言 嵌入式实…

最前沿・量子退火建模方法(1) : subQUBO讲解和python实现

前言 量子退火机在小规模问题上的效果得到了有效验证&#xff0c;但是由于物理量子比特的大规模制备以及噪声的影响&#xff0c;还没有办法再大规模的场景下应用。 这时候就需要我们思考&#xff0c;如何通过软件的方法怎么样把大的问题分解成小的问题&#xff0c;以便通过现在…

远程桌面防火墙是什么?

远程桌面防火墙&#xff0c;是一种针对远程桌面应用的安全防护工具。它可以在保证远程桌面连接的便利性和高效性的对网络连接进行安全性的保护&#xff0c;防止未经授权的访问和潜在的安全风险。 远程桌面防火墙的主要功能是对远程桌面连接进行监控和管理。它通过识别和验证连接…

cron表达式使用手册

cron表达式 我们在使用定时调度任务的时候&#xff0c;最常用的就是cron表达式。通过cron表达式来指定任务在某个时间点或者周期性执行。 范围&#xff1a; 秒&#xff08;0-59&#xff09;&#xff08;可选&#xff09; 分&#xff08;0-59&#xff09; 时&#xff08;0-…

ansible的常见用法

目录 ##编辑hosts文件 ##copy模块##复制过去 ##fetch模块##拉取 ##shell模块 ##好用 ##command模块## ##file模块### ##cron模块### ##crontab 计划任务 ##下载好时间插件 ##script模块 ##yum模块## ##yum下载源配置文件 /etc/yum.repos.d/CentOS-Base.repo ##ser…

Linux 使用 ifconfig 报错:Failed to start LSB: Bring up/down networking

一、报错信息 在运行项目时报错数据库连接失败&#xff0c;我就想着检查一下虚拟机是不是 Mysql 服务忘了开&#xff0c;结果远程连接都连接不上虚拟机上的 Linux 了&#xff0c;想着查一下 IP 地址看看&#xff0c;一查就报错了&#xff0c;报错信息&#xff1a; Restarting…

LeetCode34:在排序数组中查找元素的第一个和最后一个位置(Java)

目录 题目&#xff1a; 题解&#xff1a; 方法一&#xff1a; 方法二&#xff1a; 题目&#xff1a; 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&…

Netty学习——高级篇2 Netty解码技术

接上篇&#xff1a;Netty学习——高级篇1 拆包 、粘包与编解码技术&#xff0c;本章继续介绍Netty的其他解码器 1 DelimiterBasedFrameDecoder分隔符解码器 DelimiterBasedFrameDecoder 分隔符解码器是按照指定分隔符进行解码的解码器&#xff0c;通过分隔符可以将二进制流拆分…