【ES6】Set和Map数据结构

  • 目录

    Set

    用法 

    Set属性和方法

     遍历

    Map

     用法

    属性和方法

    遍历 


    Set

用法 

ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。

Set本身是一个构造函数,用来生成 Set 数据结构。add()方法向 Set 结构加入成员。例:

const s = new Set();[2, 3, 2, 4, 4, 5, 2].forEach(x => s.add(x));for (let i of s) {console.log(i);
}
// 2 3 4 5

上面代码通过add()方法加入成员,遍历输出后可见没有重复的值。

Set函数可以接受一个数组(或者具有 iterable 接口的其他数据结构)作为参数,用来初始化。所以可以用Set来给数组去重。例:

//单个数组去重
let array = [1, 2, 2, 3, 3, 4, 5, 5]
let uniqueArray = new Set(array)
console.log(uniqueArray)//两个数组去重
const array1 = [1, 2, 3, 4]
const array2 = [3, 4, 5, 6]// 将两个数组合并并使用Set去重
const mergedArray = new Set([...array1, ...array2])
console.log(mergedArray)// 计算两个数组的交集
const intersection = array1.filter((item) => array2.includes(item))
console.log(intersection)// 计算两个数组的并集
const union = [...new Set([...array1, ...array2])]
console.log(union)// 计算两个数组的差集
// const difference = array1.filter((item) => !array2.includes(item))
// console.log(difference)
const difference1 = array1.filter((item) => !array2.includes(item))
const difference2 = array2.filter((item) => !array1.includes(item))const symmetricDifference = [...difference1, ...difference2]console.log(symmetricDifference)

上面的方法也可以用于,去除字符串里面的重复字符。

[...new Set('ababbc')].join('')
// "abc"

向 Set 加入值的时候,不会发生类型转换,所以5"5"是两个不同的值。“Same-value-zero equality”可用来判断Set 内部两个值是否不同,类似于精确相等运算符(===),区别在于向 Set 加入值时认为NaN等于自身,而精确相等运算符认为NaN不等于自身。

let set = new Set();
let a = NaN;
let b = NaN;
set.add(a);
set.add(b);
set // Set {NaN}

上面代码向 Set 实例添加了两次NaN,但是只会加入一个。这表明,在 Set 内部,两个NaN是相等的。

另外,两个对象总是不相等的。

let set = new Set();set.add({});
set.size // 1set.add({});
set.size // 2

上面代码表示,由于两个空对象不相等,所以它们被视为两个值。

Set属性和方法

Set 结构的实例有以下属性。

  • Set.prototype.constructor:构造函数,默认就是Set函数。
  • Set.prototype.size:返回Set实例的成员总数。

Set 实例的方法分为两大类:操作方法(用于操作数据)和遍历方法(用于遍历成员)。下面先介绍四个操作方法。

  • Set.prototype.add(value):添加某个值,返回 Set 结构本身。
  • Set.prototype.delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
  • Set.prototype.has(value):返回一个布尔值,表示该值是否为Set的成员。
  • Set.prototype.clear():清除所有成员,没有返回值。

 遍历

Set 结构的实例有四个遍历方法,可以用于遍历成员。

  • Set.prototype.keys():返回键名的遍历器
  • Set.prototype.values():返回键值的遍历器
  • Set.prototype.entries():返回键值对的遍历器
  • Set.prototype.forEach():使用回调函数遍历每个成员

需要特别指出的是,Set的遍历顺序就是插入顺序。这个特性有时非常有用,比如使用 Set 保存一个回调函数列表,调用时就能保证按照添加顺序调用。

  • Map

 用法

Map 数据结构,类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。

添加、删除成员:

const m = new Map();
const o = {p: 'Hello World'};m.set(o, 'content')
m.get(o) // "content"m.has(o) // true
m.delete(o) // true
m.has(o) // false

上面代码使用 Map 结构的set方法,将对象o当作m的一个键,然后又使用get方法读取这个键,接着使用delete方法删除了这个键。

作为构造函数,Map 也可以接受一个数组作为参数。该数组的成员是一个个表示键值对的数组。例:

const map = new Map([['name', '张三'],['title', 'Author']
]);map.size // 2
map.has('name') // true
map.get('name') // "张三"
map.has('title') // true
map.get('title') // "Author"

上面代码在新建 Map 实例时,就指定了两个键nametitle

如果对同一个键多次赋值,后面的值将覆盖前面的值。如果读取一个未知的键,则返回undefined

属性和方法

  • size 属性

size属性返回 Map 结构的成员总数。

  • Map.prototype.set(key, value)

set方法设置键名key对应的键值为value,然后返回整个 Map 结构。如果key已经有值,则键值会被更新,否则就新生成该键。

  • Map.prototype.get(key)

get方法读取key对应的键值,如果找不到key,返回undefined

  • Map.prototype.has(key)

has方法返回一个布尔值,表示某个键是否在当前 Map 对象之中。

  • Map.prototype.delete(key)

delete()方法删除某个键,返回true。如果删除失败,返回false

  • Map.prototype.clear()

clear()方法清除所有成员,没有返回值。

遍历 

Map 结构原生提供三个遍历器生成函数和一个遍历方法。

  • Map.prototype.keys():返回键名的遍历器。
  • Map.prototype.values():返回键值的遍历器。
  • Map.prototype.entries():返回所有成员的遍历器。
  • Map.prototype.forEach():遍历 Map 的所有成员。

需要特别注意的是,Map 的遍历顺序就是插入顺序。

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

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

相关文章

CCF-CSP认证考试 202212-2 训练计划 100分题解

更多 CSP 认证考试题目题解可以前往:CSP-CCF 认证考试真题题解 原题链接: 202212-2 训练计划 时间限制: 1.0s 内存限制: 512.0MB 问题背景 西西艾弗岛荒野求生大赛还有 n n n 天开幕! 问题描述 为了在大赛中取得…

【Linux】进程的基本概念(进程控制块,ps命令,top命令查看进程)

目录 01.进程的基本概念 程序与进程 进程的属性 02.进程控制块(PCB) task_struct的内容分类 组织进程 03.查看进程 ps命令 top指令 在计算机科学领域,进程是一项关键概念,它是程序执行的一个实例,是操作系统的…

【逆向】利用Objection实现移动应用抓取https流量

那女孩对我说 说我保护她的梦 说这个世界 对她这样的不多 她渐渐忘了我 但是她并不晓得 遍体鳞伤的我 一天也没再爱过 🎵 黄义达《那女孩对我说》 在移动应用开发和安全测试中,抓包是一项重要的技能,它可以帮助开发者和…

Mybatis的核心配置文件

MyBatis的全局配置文件mybatis-config.xml,配置内容如下: properties(属性)settings(全局配置参数)typeAliases(类型别名)typeHandlers(类型处理器)objectFa…

面试知识汇总——垃圾回收器(分代收集算法)

分代收集算法 根据对象的存活周期,把内存分成多个区域,不同区域使用不同的回收算法回收对象。 对象在创建的时候,会先存放到伊甸园。当伊甸园满了之后,就会触发垃圾回收。 这个回收的过程是:把伊甸园中的对象拷贝到F…

flutter项目使用ffi和原生交互问题积累

一、动态库和静态库调用不了的问题 1.flutter项目中运行iOS使用静态库.a问题 错误信息:Invalid argument(s): Failed to lookup symbol native_add:dlsym(RTLD_DEFAULT, native_add): symbolnot found 解决: 使用xcode打开Runner.xcworkspace&#xff0c…

跨时钟域学习记录(二)——XPM_CDC

本文以Xilinx提供的xpm_cdc代码为例,整理处理跨时钟域数据传输的常见方法。 宏定义 Xilinx定义了多个宏定义代替描述触发器行为的always块,列举如下 宏名称含义XPM_XSRREG带同步复位/置位的同步寄存器XPM_XSRREGEN带同步复位/置位和使能的寄存器XPM_XA…

【物联网】Qinghub Kafka 数据采集

基础信息 组件名称 : kafka-connector 组件版本: 1.0.0 组件类型: 系统默认 状 态: 正式发布 组件描述:通用kafka连接网关,消费来自kafka的数据,并转发给下一个节点做相关的数据解析。 配置文…

网络七层模型之物理层:理解网络通信的架构(一)

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Visual Studio 常用快捷键大全

前言 对于开发者而言,熟悉快捷键的使用,能够起到事半功倍的作用,提高工作效率。以下是我整理的一份Visual Studio常用快捷键清单,希望能够帮助到你。 常用快捷方式 快捷键功能Ctrl K C注释选定内容Ctrl K U取消注释选定内容…

Vue 3.0 中一些主要的生命周期钩子

Vue 3.0 的生命周期钩子与 Vue 2.x 有所不同,但基本的概念和用途是相似的。这些钩子函数允许你在组件的不同阶段执行特定的逻辑。以下是 Vue 3.0 中一些主要的生命周期钩子: setup():这是 Vue 3 引入的一个新钩子,它在组件创建之前…

如何忽略Chrome最小字号的限制

通过控制台调整字体大小时,可以发现即便设置了小于12px的字号,也并不会变小,这是因为Chrome默认最小字号为12px。 在Chrome设置中的外观选项卡中可以发现,默认字体是16px。将最小字号改为0,就能随意设置小于12px的字号…

spring boot商城、商城源码 欢迎交流

一个基于spring boot、spring oauth2.0、mybatis、redis的轻量级、前后端分离、防范xss攻击、拥有分布式锁,为生产环境多实例完全准备,数据库为b2b2c设计,拥有完整sku和下单流程的商城 联系: V-Tavendor

文件编辑命令—vim

1.vim vim 是vi的升级版本.vi 文件名(vi方向键用不了) vim 的官方网站 (welcome home : vim online) 自己也说 vim 是一个程序开发工具而不是文字处理软件。 2.安装vim sudo apt install vim 如果出错了:apt update:刷新软件源; 出现"无法获得锁 之类的"sudo rm 文件…

Java 如何针对不同类型判断一个对象是否为空

在Java中,要判断一个对象是否为空,通常需要考虑不同类型的对象。下面是针对不同情况的一些常用方法: 判断引用类型对象是否为null: 对于引用类型的对象,可以使用简单的判空操作来检查是否为null。 Object obj null…

后端常问面经之并发

volatile 关键字 volatile关键字是如何保证内存可见性的?底层是怎么实现的? "观察加入volatile关键字和没有加入volatile关键字时所生成的汇编代码发现,加入volatile关键字时,会多出一个lock前缀指令”lock前缀指令实际上相…

2015年认证杯SPSSPRO杯数学建模D题(第二阶段)城市公共自行车全过程文档及程序

2015年认证杯SPSSPRO杯数学建模 D题 城市公共自行车 原题再现: 城市交通问题直接影响市民的生活和工作。在地形平坦的城市,公共自行车出行系统是一种很好的辅助手段。一般来说,公共自行车出行系统由数据中心、驻车站点、驻车桩、自行车&…

吴恩达深度学习笔记:浅层神经网络(Shallow neural networks)3.1-3.5

目录 第一门课:神经网络和深度学习 (Neural Networks and Deep Learning)第三周:浅层神经网络(Shallow neural networks)3.1 神经网络概述(Neural Network Overview)3.2 神经网络的表示(Neural Network Representation…

2024年碑林区软科学研究项目申报类型方向、时间流程要求

一、征集类型及研究方向 项目类型:重点支持综合运用自然科学、社会科学和工程技术多门类、多学科知识,为科技和经济社会发展的重大决策提供支撑。 项目支持以“五大发展理念”为指导,围绕科技、经济、民生等社会发展问题,开展对策研究,包含但不限于:加快培育新质生产力、秦创…

【Java八股面试系列】中间件-Redis

目录 Redis 什么是Redis Redis解决了什么问题 Redis的实现原理 数据结构 String 常用命令 应用场景 List(列表) 常用命令 应用场景 Hash(哈希) 常用命令 应用场景 set(集合) 常见命令​编辑 应用场景 Sorted Set(有序集合) 常见命令​编辑 应用场景 数据持…