日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/7/23 编程问答 87 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

推薦文章

關注的我的公眾號不定期分享前端知識,與您一起進步!

總結

以上是生活随笔為你收集整理的set和map去重调用什么方法_你真的了解ES6的Set,WeakSet,Map和WeakMap吗?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。