set和map去重调用什么方法_你真的了解ES6的Set,WeakSet,Map和WeakMap吗?

之前在学习 ES6 的时候,看到 Set 和 Map,不知道其应用场景有哪些,只觉得很多时候会用在数组去重和数据存储,后来慢慢才领悟到 Set 是一种叫做集合的数据结构,Map 是一种叫做字典的数据结构。

Set

Set 本身是一个构造函数,用来生成 Set 数据结构。Set 函数可以接受一个数组(或者具有 iterable 接口的其他数据结构)作为参数,用来初始化。Set 对象允许你存储任何类型的值,无论是原始值或者是对象引用。它类似于数组,但是成员的值都是唯一的,没有重复的值。

const s = new Set()

[2, 3, 5, 4, 5, 2, 2].forEach((x) => s.add(x))

for (let i of s) {

console.log(i)

}

// 2 3 5 4

Set 中的特殊值

Set 对象存储的值总是唯一的,所以需要判断两个值是否恒等。有几个特殊值需要特殊对待:

+0 与 -0 在存储判断唯一性的时候是恒等的,所以不重复

undefined 与 undefined 是恒等的,所以不重复

NaN 与 NaN 是不恒等的,但是在 Set 中认为 NaN 与 NaN 相等,所有只能存在一个,不重复。

Set 的属性:

size:返回集合所包含元素的数量

const items = new Set([1, 2, 3, 4, 5, 5, 5, 5])

items.size // 5

Set 实例对象的方法

add(value):添加某个值,返回 Set 结构本身(可以链式调用)。

delete(value):删除某个值,删除成功返回 true,否则返回 false。

has(value):返回一个布尔值,表示该值是否为 Set 的成员。

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

s.add(1).add(2).add(2)

// 注意2被加入了两次

s.size // 2

s.has(1) // true

s.has(2) // true

s.has(3) // false

s.delete(2)

s.has(2) // false

遍历方法

keys():返回键名的遍历器。

values():返回键值的遍历器。

entries():返回键值对的遍历器。

forEach():使用回调函数遍历每个成员。

由于 Set 结构没有键名,只有键值(或者说键名和键值是同一个值),所以 keys 方法和 values 方法的行为完全一致。

let set = new Set(['red', 'green', 'blue'])

for (let item of set.keys()) {

console.log(item)

}

// red

// green

// blue

for (let item of set.values()) {

console.log(item)

}

// red

// green

// blue

for (let item of set.entries()) {

console.log(item)

}

// ["red", "red"]

// ["green", "green"]

// ["blue", "blue"]

Array 和 Set 对比

Array 的 indexOf 方法比 Set 的 has 方法效率低下

Set 不含有重复值(可以利用这个特性实现对一个数组的去重)

Set 通过 delete 方法删除某个值,而 Array 只能通过 splice。两者的使用方便程度前者更优

Array 的很多新方法 map、filter、some、every 等是 Set 没有的(但是通过两者可以互相转换来使用)

Set 的应用

1、Array.from 方法可以将 Set 结构转为数组。

const items = new Set([1, 2, 3, 4, 5])

const array = Array.from(items)

2、数组去重

// 去除数组的重复成员

;[...new Set(array)]

Array.from(new Set(array))

3、数组的 map 和 filter 方法也可以间接用于 Set

let set = new Set([1, 2, 3])

set = new Set([...set].map((x) => x * 2))

// 返回Set结构:{2, 4, 6}

let set = new Set([1, 2, 3, 4, 5])

set = new Set([...set].filter((x) => x % 2 == 0))

// 返回Set结构:{2, 4}

4、实现并集 (Union)、交集 (Intersect) 和差集

let a = new Set([1, 2, 3])

let b = new Set([4, 3, 2])

// 并集

let union = new Set([...a, ...b])

// Set {1, 2, 3, 4}

// 交集

let intersect = new Set([...a].filter((x) => b.has(x)))

// set {2, 3}

// 差集

let difference = new Set([...a].filter((x) => !b.has(x)))

// Set {1}

weakSet

WeakSet 结构与 Set 类似,也是不重复的值的集合。

成员都是数组和类似数组的对象,若调用 add() 方法时传入了非数组和类似数组的对象的参数,就会抛出错误。

const b = [1, 2, [1, 2]]

new WeakSet(b) // Uncaught TypeError: Invalid value used in weak set

成员都是弱引用,可以被垃圾回收机制回收,可以用来保存 DOM 节点,不容易造成内存泄漏。

WeakSet 不可迭代,因此不能被用在 for-of 等循环中。

WeakSet 没有 size 属性。

Map

Map 中存储的是 key-value 形式的键值对, 其中的 key 和 value 可以是任何类型的, 即对象也可以作为 key。 Map 的出现,就是让各种类型的值都可以当作键。Map 提供的是 “值-值”的对应。

Map 和 Object 的区别

Object 对象有原型, 也就是说他有默认的 key 值在对象上面, 除非我们使用 Object.create(null)创建一个没有原型的对象;

在 Object 对象中, 只能把 String 和 Symbol 作为 key 值, 但是在 Map 中,key 值可以是任何基本类型(String, Number, Boolean, undefined, NaN….),或者对象(Map, Set, Object, Function , Symbol , null….);

通过 Map 中的 size 属性, 可以很方便地获取到 Map 长度, 要获取 Object 的长度, 你只能手动计算

Map 的属性

size: 返回集合所包含元素的数量

const map = new Map()

map.set('foo', ture)

map.set('bar', false)

map.size // 2

Map 对象的方法

set(key, val): 向 Map 中添加新元素

get(key): 通过键值查找特定的数值并返回

has(key): 判断 Map 对象中是否有 Key 所对应的值,有返回 true,否则返回 false

delete(key): 通过键值从 Map 中移除对应的数据

clear(): 将这个 Map 中的所有元素删除

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

遍历方法

keys():返回键名的遍历器

values():返回键值的遍历器

entries():返回键值对的遍历器

forEach():使用回调函数遍历每个成员

const map = new Map([

['a', 1],

['b', 2],

])

for (let key of map.keys()) {

console.log(key)

}

// "a"

// "b"

for (let value of map.values()) {

console.log(value)

}

// 1

// 2

for (let item of map.entries()) {

console.log(item)

}

// ["a", 1]

// ["b", 2]

// 或者

for (let [key, value] of map.entries()) {

console.log(key, value)

}

// "a" 1

// "b" 2

// for...of...遍历map等同于使用map.entries()

for (let [key, value] of map) {

console.log(key, value)

}

// "a" 1

// "b" 2

数据类型转化

Map 转为数组

let map = new Map()

let arr = [...map]

数组转为 Map

Map: map = new Map(arr)

Map 转为对象

let obj = {}

for (let [k, v] of map) {

obj[k] = v

}

对象转为 Map

for( let k of Object.keys(obj)){

map.set(k,obj[k])

}

Map的应用

在一些 Admin 项目中我们通常都对个人信息进行展示,比如将如下信息展示到页面上。传统方法如下。

姓名

{{info.name}}

年龄

{{info.age}}

性别

{{info.sex}}

手机号

{{info.phone}}

家庭住址

{{info.address}}

家庭住址

{{info.duty}}

js 代码

mounted() {

this.info = {

name: 'jack',

sex: '男',

age: '28',

phone: '13888888888',

address: '广东省广州市',

duty: '总经理'

}

}

我们通过 Map 来改造,将我们需要显示的 label 和 value 存到我们的 Map 后渲染到页面,这样减少了大量的html代码

{{label}}

{{value}}

js 代码

data: () => ({

info: {},

infoMap: {}

}),

mounted () {

this.info = {

name: 'jack',

sex: '男',

age: '28',

phone: '13888888888',

address: '广东省广州市',

duty: '总经理'

}

const mapKeys = ['姓名', '性别', '年龄', '电话', '家庭地址', '身份']

const result = new Map()

let i = 0

for (const key in this.info) {

result.set(mapKeys[i], this.info[key])

i++

}

this.infoMap = result

}

WeakMap

WeakMap 结构与 Map 结构类似,也是用于生成键值对的集合。

只接受对象作为键名(null 除外),不接受其他类型的值作为键名

键名是弱引用,键值可以是任意的,键名所指向的对象可以被垃圾回收,此时键名是无效的

不能遍历,方法有 get、set、has、delete

总结

Set

是一种叫做集合的数据结构(ES6新增的)

成员唯一、无序且不重复

[value, value],键值与键名是一致的(或者说只有键值,没有键名)

允许储存任何类型的唯一值,无论是原始值或者是对象引用

可以遍历,方法有:add、delete、has、clear

WeakSet

成员都是对象

成员都是弱引用,可以被垃圾回收机制回收,可以用来保存 DOM 节点,不容易造成内存泄漏

不能遍历,方法有 add、delete、has

Map

是一种类似于字典的数据结构,本质上是键值对的集合

可以遍历,可以跟各种数据格式转换

操作方法有:set、get、has、delete、clear

WeakMap

只接受对象作为键名(null 除外),不接受其他类型的值作为键名

键名是弱引用,键值可以是任意的,键名所指向的对象可以被垃圾回收,此时键名是无效的

不能遍历,方法有 get、set、has、delete

推荐文章

关注的我的公众号不定期分享前端知识,与您一起进步!

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

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

相关文章

c语言整数反转用while函数,7.整数反转(LeetCode)——C语言

根据题目要求,必须是32位有符号整数,数值范围是[-2^31, 2^31-1],换算出来就是-2147483648 —— 2147483647之间。将此范围内的数值反转可能会导致溢出,比如1234567893,反转之后为3987654321,已然超出了以上…

python画饼图存在的问题_Matplotlib 绘制饼图解决文字重叠的方法

在使用Matplotlib 绘制饼图的时候有些时候一些数据的比列太小在饼图呈现的效果不明显 很容易被覆盖,为了解决这个问题以下就是我个人的心得。 【未解决之前呈现的效果】可以看到这个饼状图其他和硕士这2个部分占比很小而且比例相互覆盖,这让人看起来不舒…

antdesign图片点击放大_点击图片放大特效代码,全屏显示,再点击恢复原状【多种方法】...

我们先来看看效果如何,点击图片试一试。图片的实际大小为1920x1080,我们先把宽度限制在300px,点击后图片还原到100%(如果浏览器窗口高度小于图片的真实高度,这样的情况下,图片虽然宽度还原到100%,但是所显示…

c语言中math的库函数,C语言中math.h库中的常用函数

C语言中math.h库中的常用函数 int abs(int i) 返回整型参数i的绝对值double cabs(struct complex znum) 返回复数znum的绝对值double fabs(double x) 返回双精度参数x的绝对值long labs(long n) 返回长整型参数n的绝对值double exp(double x) 返回指数函数e^x的值double frexp(…

python变量类型是动态的_【Python】python动态类型

在python中,省去了变量声明的过程,在引用变量时,往往一个简单的赋值语句就同时完成了,声明变量类型,变量定义和关联的过程,那么python的变量到底是怎样完成定义的呢? 动态类型 python使用动态类…

python bottle部署g_python bottle框架(WEB开发、运维开发)教程 | linux系统运维

教程目录一:python基础二:bottle基础python bottle 框架基础教程:环境部署三:WEB开发教程四:运维开发教程运维开发(1.1):框架、结构介绍运维开发(1.2):前端(ajax)说明运维开发(1.3):…

c语言excel转pdf,基于C语言和Excel软件下光速测量仪测量玻璃折射率.pdf

基于C语言和Excel软件下光速测量仪测量玻璃折射率.pdf基于语言和 软件下光速测量仪测量玻璃折射率 朱承君 王奇峰 芦立娟 张艳春 ( 浙江海洋学院机电学院 浙江 舟山 ) ( 收稿日期 ) 摘要 介绍了用等相位法测玻璃折射率的原理和方法, 并利用了 语言和 在科学计算中的…

python3.7界面_Python3.7+tkinter实现查询界面功能

Tkinter 是 Python 的标准 GUI 库。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。 这篇文章使用tkinter实现一个简单的查询界面 #!/usr/bin/python # -*- coding: UTF-8 -*- from tkinter import * import sqlite3 # 导入消息对话框子模块 import tkinter.messagebox #im…

python中级水平_python 初级/中级/高级/核心

"一等对象":满足条件:1.在运行时创建 2.能赋值给变量或数据结构中的元素 3.能作为参数传递给函数 4.能作为函数的返回结果[ 整数、字符串、字典、"所有函数" ]等都是一等对象"什么是函数"调用:直接使用、不需要类或对象进…

c语言报错spawning 插1,C语言错误····error spawning c1.exe

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼“CL.exe”是VC使用真正的编译器(编译程序),其路径在“VC根目录\VC98\Bin”下面,你可以到相应的路径下找到这个应用程序。因此问题可以按照以下方法解决:打开vc界面 点击VC“TOOLS(工具)”—>…

python中的元类_Python中的元类(metaclass)

提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解。他知道这肯定和自身有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理解,以及在什么情况下需要进行元编程。 …

方言大全_长沙人亲戚称呼大全!记得收藏以防失传!

长沙人亲戚称呼大全!记得收藏以防失传!首先,看一下中国亲戚称谓图!▼长沙方言对于亲人的称谓自有一套说法!(如有不同,以你自己的叫法为准哦~)▼长辈篇父亲:ya、“爷(ya)老倌”,“爷(…

adb android源码分析,Android Adb 源码解析(base on Android 9.0)

Adb 框架Adb架构Android Adb 一共分为三个部分:adb、adb server、adbd,源码路径:system⁩/⁨core⁩/⁨adb。adb和adb server 是运行在PC端,adb就是大家所熟悉的控制台命令adb,adb server是由adb fork出的一个常驻后台的…

oracle 解锁 账户_oracle用户解锁三种方法

ORA-28000: the account is locked-的解决办法2009-11-11 18:51ORA-28000: the account is locked第一步:使用PL/SQL,登录名为system,数据库名称不变,选择类型的时候把Normal修改为Sysdba;第二步:选择myjob,查看users;第三步&…

android 解码webp动画,android webp编解码详解

key words:android decode webp sample当我敲下键盘的时候有种深深的耻辱感,看到android 4.0支持webp格式的图像,于是我狠命的找提供了什么样的api,nnd,硬是没找到,后来抱着试试的心态,用Bitmap…

python生成json_如何将Python数组转为Json格式数据并存储?

在Python中将数组转为Json数据存储时需要用到将json模块中的json.dumps()或者json.dump()方法。 json.dumps()方法用法 使用json.dumps( )方法将Python数组转为json格式数据 # 导入json模块 import json # 定义Python数组 py_list [{JavaEE: "http://java.itheima.com&qu…

rust里mp5a4_Rust源码分析:channel内部mpsc队列

首先,之前的upgrade过程中内存的回收要稍微注意下。因为Receiver现在指向shared::Packet之后,那个new_port需要被析构,也就是调用drop函数,我们看下drop的实现:implDropforReceiver{fn drop(&mutself){match*unsaf…

android settext 参数,Android TextView.setTextColor()的参数设置方式

摘要:Android TextView.setTextColor()的参数设置方式查了下资料发现setTextColor()的参数应该写成以下的这种形式:setTextColor(0xFF0000FF);//0xFF0000FF是int类型的数据,分组一下0x|FF|0000FF,0x是代表颜色整数的标记&#xff…

vscode angular智能提示_【线下活动】手把手教你玩转 VS Code 插件开发

感谢 Google Developer Group 的邀请,3 月 30 号下午,韩老师将手把手带你玩转 VS Code 插件开发。 Angular 使用了 TypeScript,VS Code 使用了 Chromium。感谢这个开放与包容的时代,技术无界,正是大家对技术有着执着的…

ext js如何动态更改xtype_K8S ConfigMap 用于动态应用程序的实践

编辑:小君君技术校对:星空下的文仔、bot在 Kubernetes 中,ConfigMap 是允许管理员将配置组件与镜像内容解耦,使容器化应用程序产生可移植性的一种资源。ConfigMap 可以与 Kubernetes Pod 一起使用,用于动态添加或更改容…