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吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android微信支付服务端,Andro
- 下一篇: matlab的精度变量,MatLab