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.rhkb.cn/news/311025.html

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

相关文章

FlexLua低代码技术,十分钟搞定4G转LoRa网关设备

在当今物联网时代&#xff0c;无线通信技术的发展日新月异&#xff0c;4G和LoRa作为两种不同的通信技术&#xff0c;各自拥有独特的优势和应用场景。而4G转LoRa网关设备的出现&#xff0c;则将这两种技术有效地结合起来&#xff0c;为物联网应用提供了更多可能性。 4G转LoRa网关…

【自媒体创作利器】AI白日梦+ChatGPT 三分钟生成爆款短视频

AI白日梦https://brmgo.com/signup?codey5no6idev 引言 随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;AI在各个领域都展现出了强大的应用潜力。其中&#xff0c;自然语言处理技术的进步使得智能对话系统得以实现&#xff0c;而ChatGPT作为其中的代表之一…

Bytebase 2.15.0 - GitOps 整体升级

&#x1f514; GitOps 整体升级 新版 GitOps 和之前版本不兼容&#xff0c;如果需要升级协助&#xff0c;请联系我们。 使用访问令牌进行身份验证。支持项目中配置多个 VCS 连接器。支持在 VCS 连接器中指定数据库分组为目标&#xff08;默认情况下应用于项目中的所有数据库&…

在深度残差收缩网络中,我对阈值的理解!

在深度残差收缩网络中&#xff0c;使用Sigmoid函数将输出归一化到0和1之间是为了确保阈值α的取值范围在可接受的范围内。Sigmoid函数具有将任意输入映射到(0, 1)区间的特性&#xff0c;这有助于控制阈值的大小和变化范围。 将阈值设置为(特征图的绝对值)(一个系数α)是基于以…

单链表使用里面为什么是二级指针

这里很多人就会疑问&#xff0c;为什么顺序表里面是一级指针&#xff0c;单链表里面是二级指针。 这里我们专门列出来进行讲解。 因为传递的不是二级指针的话&#xff0c;会导致传参之后&#xff0c;形参改变&#xff0c;实参不改变 你希望形参改变实参也改变就必须传递地址 简…

构建鸿蒙ACE静态库

搭建开发环境 根据说明文档下载鸿蒙全部代码&#xff0c;一般采取第四种方式获取最新代码(请保证代码为最新) 源码获取Windows下载编译环境 MinGW GCC 7.3.0版本 请添加环境变量IDE 可以使用两种 CLion和Qt,CLion不带有环境需要安装MinGW才可以开发,Qt自带MinGW环境&#xff0…

Springboot+Vue项目-基于Java+MySQL的校园周边美食探索及分享平台系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

html球体涨水

简单 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>div…

在比特币中,1 sat 是多少美元?

普通人绝对想不到&#xff0c;比特币能在2024年达到这个价值&#xff0c;早知道的话&#xff0c;我当初就是破釜沉舟也得买一个啊。 而在4月19号&#xff0c;也将迎来比特币再次减半。减半并不是说玩家手中的比特币要被突然减去一半&#xff0c;而是在后续的挖矿过程中&#xf…

CSS基础之伪元素选择器(如果想知道CSS的伪元素选择器知识点,那么只看这一篇就足够了!)

前言&#xff1a;我们已经知道了在CSS中&#xff0c;选择器有基本选择器、复合选择器、伪类选择器、那么选择器学习完了吗&#xff1f;显然是没有的&#xff0c;这篇文章讲解最后一种选择器——伪元素选择器。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我…

移动端web适配方案

以下是移动端适配的多个方案&#xff0c;也可以说说你是怎么做的。 正文 自适应&#xff1a;根据不同的设备屏幕大小来自动调整尺寸、大小 响应式&#xff1a;会随着屏幕的实时变动而自动调整&#xff0c;是一种更强的自适应 为什么要做移动端适配&#xff1f; 目前市面上…

2024很漂亮的个人主页HTML源码

源码介绍 很漂亮的个人主页HTML源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 截图效果 源码下载 很漂亮的个人主页HTML源码

第七讲:C语言指针(1)

目录 1、内存和地址 1.1、内存 1.2、究竟该如何理解编址 2、指针变量和地址 2.1、取地址操作符&#xff08;&&#xff09; 2.2、指针变量和解引⽤操作符 2.2.1、指针变量 2.2.2、如何理解指针类型 2.2.3、解引⽤操作符 2.3、指针变量的⼤⼩ 3、指针变量类型的意…

Input DropDown 拼接成 select组件(基于antd和react)

前言&#xff1a;为什么不直接用select&#xff0c;还要舍近求远搞inputdropdown这种缝合怪&#xff0c;是因为antd的select不支持选中项再编辑&#xff0c;效果如图 比如&#xff1a;选中的lucy文案变成了placeholder不能再编辑了 封装此组件虽然比较简单&#xff0c;但还是有…

基于SSM的购物小程序01

4.1系统架构设计 购物系统设计的系统项目的概述设计分析&#xff0c;主要内容有学习平台的具体分析&#xff0c;进行数据库的是设计&#xff0c;数据采用mysql数据库&#xff0c;并且对于系统的设计采用比较人性化的操作设计&#xff0c;对于系统出现的错误信息可以及时做出处…

在Vue3中如何使用H.265视频流媒体播放器EasyPlayer.js?

H5无插件流媒体播放器EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;可支持H.264与H.265编码格式&#xff0c;性能稳定、播放流畅&#xff0c;能支持WebSocket-FLV、HTTP-FLV&#xff0c;HLS&#xff08;m3u8&#…

E9:拦截流程系统管理员操作记录,流转记录不显示(ECODE)

效果&#xff1a; ecodeSDK.rewriteApiDataQueueSet({fn: (url, params, data) > {const { hash } window.location;if (!hash.startsWith(#/main/workflow/req)) return false; // 判断页面地址if (!ecCom.WeaTools.Base64) return false; // 完整组件库加载完成if (!W…

r3live 使用前提 雷达-相机外参标定 livox_camera_lidar_calibration

标定的是相机到雷达的,R3live下面配置的雷达到相机的,所以要把得到外参旋转矩阵求逆,再填入,平移矩阵则取负 港科大livox_camera_calib虽然操作方便&#xff0c;但是使用mid360雷达会有视角问题&#xff08;投影三维点到相机&#xff09;&#xff0c;尝试了很多场景&#xff0c…

js纯前端实现语音播报,朗读功能(2024-04-15)

实现语音播报要有两个原生API 分别是【window.speechSynthesis】【SpeechSynthesisUtterance】 项目代码 // 执行函数 initVoice({text: 项目介绍,vol: 1,rate: 1 })// 函数 export function initVoice(config) {window.speechSynthesis.cancel();//播报前建议调用取消的函数…

在PostGIS中计算点数据集的最小外包凸多边形等

存在点&#xff08;或线&#xff09;数据集&#xff0c;其分布情况如下&#xff1a; 现在想要获取该数据的几个外包多边形&#xff0c;主要包含如下三个方法&#xff1a; 第一种方法&#xff0c;最小外包凸多边形&#xff0c;其结果如下&#xff1a; 查询语句&#xff1a;ST…