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.hqwc.cn/news/617055.html

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

相关文章

下载了恶意软件怎么办,用这个软件可以解决 Mac电脑卸载软件 MacBook查杀病毒

随着苹果电脑在全球市场的普及&#xff0c;它们也日益成为恶意软件制作者的目标。这种趋势打破了许多人认为Mac系统不易受到病毒或恶意软件影响的传统观念。事实上&#xff0c;苹果电脑面临的恶意软件和安全威胁正在不断增多&#xff0c;这要求用户采取更加积极的措施来保护自己…

将OpenWrt 23.05.3部署到VMware ESXi

正文共&#xff1a;1234 字 38 图&#xff0c;预估阅读时间&#xff1a;2 分钟 前面把OpenWrt部署到了VMware workstation上&#xff08;VMware Workstation部署最新版OpenWrt 23.05.3&#xff09;。如果想把OpenWrt直接部署到ESXi上&#xff0c;你会发现转换镜像不能直接生成O…

Redis(哨兵模式)

什么是哨兵机制 问题: redis 主从复制模式下, 一旦主节点由于故障不能提供服务, 需要人工进行主从切换, 同时大量客户端需要被通知切换到新的主节点上, 对于有一定规模的应用来说, 对于人力的资源消耗会很大.解决: 通过哨兵对主从结构进行监控, 一旦出现主节点挂了的情况, 自动…

ZFT9 7VE8033同期脉冲发送装置 JSOEF约瑟

系列型号 ZFT9(PIG) 7VE8033同期脉冲发送装置; ZFT9(PIG) 7VE8043同期脉冲发送装置; ZFT9 7VE8033同期脉冲发送装置; ZFT9 7VE8043同期脉冲发送装置; 用途&#xff1a; ZFT9(PIG)同期脉冲发送装置用于船舶的三相系统&#xff0c;根据发电机和电力系统之间电压差、相位差、频率…

基于生成对抗网络在服装领域的发展脉络和应用趋势

文章目录 1、概述2、深度学习图像生成模型2.1、深度信念网络(Deep belief network&#xff0c;DBN)2.2、变分自编码器(Variational auto-encoder&#xff0c;VAE)2.3、生成对抗网络(Generative adversarial networks&#xff0c;GAN) 3、 模型对比分析4、基于多模态转换的服装图…

CSS3新增

一些CSS3新增的功能 课程视频链接 目录 CSS3概述私有前缀长度单位remvwvhvmaxvmin 颜色设置方式rgbahslhsla 选择器动态伪类目标伪类语言伪类UI伪类结构伪类否定伪类伪元素 盒子属性box-sizing问题插播 宽度与设置的不同 resizebox-shadowopacity 背景属性background-originb…

C语言 数据输入输出

本文 我们来说 数据的输入与输出 及数据的运算 在程序的运算工程中 往往需要输入一些数据 而程序的运算 所得到的运算结果又需要输出给用户 因此 数据的输入与输出 就显得非常重要 在C语言中 不提供专门的输入输出语句 所有的输入输出 都是通过对标准库的调用 来实现的 一般 …

视觉SLAM学习打卡【10】-后端·滑动窗口法位姿图

本节是对上一节BA的进一步简化&#xff0c;旨在提高优化实时性.难点在于位姿图部分的雅可比矩阵求解&#xff08;涉及李代数扰动模型求导&#xff09;&#xff0c;书中的相关推导存在跳步&#xff08;可能数学功底强的人认为过渡的理所当然&#xff09;&#xff0c;笔者参考了知…

【Java多线程】案例(4):定时器

目录 一、定时器是什么? 二、Java标准库中的定时器 三、自己实现定时器 四、标准库中更推荐使用的定时器 一、定时器是什么? 定时器是一种用于在指定时间间隔或特定时间点执行特定任务的工具或设备。在计算机科学中&#xff0c;定时器通常是软件或硬件组件&#xff0c;用…

React+TS项目搭建

使用webpack5搭建ReactTS项目 一.初始化项目 初始化一个基本的reactts项目,首先创建一个项目文件夹,输入初始化命令 npm init -y 初始化完成后生成package.json文件,之后需要在项目下新增以下所示目录结构和文件 ├── build | ├── webpack.base.js # 公共配置 | ├…

造数据,别慌!使用python faker创建大批量随机测试数据

前言 在数据库的使用过程中&#xff0c;有很多场合是要自行去构造大规模数据&#xff0c;以供测试、性能功能验证使用。我在前边一文&#xff1a;PostgreSQL - 大规模随机数据生成方法里介绍了PostgreSQL中生成大规模随机数据的方法。这种方法&#xff0c;生成数据比较快&…

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

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