輕鬆上手使用ES6中的Set和Map資料結構
Set
基本用法
ES6提供了新的資料結構Set。它類似於陣列,但成員的值都是唯一的,沒有重複。Set本身是一個建構函式,用來生成Set資料結構。
const s = new Set();
[2, 3, 5, 4, 5, 2, 2].forEach( x => s.add(x));
s //[2, 3, 5, 4]
const set = [1, 2, 3, 4, 4];
[...set] // [1, 2, 3, 4]
set.size // 4
向Set加入值時不會發生型別轉換,所以5和’5’是兩個不同的值,它類似於精確的相等運算子(“===”),但是有一個特例,就是Set中的NaN與NaN是相等的。
Set例項的屬性和方法
屬性:1.Set.prototype.constructor:建構函式,預設就是Set函式。 2.Set.prototype.size:返回Set例項的成員總數。
方法:分為操作方法和遍歷方法,先介紹4個基本的操作方法。
add(value):新增某個值,返回Set結構本身
delete(value):刪除某個值,返回一個布林值,表示刪除是否成功。
has(value):返回一個布林值,表示引數是否為Set成員。
clear(value):清除所有成員,沒有返回值。
遍歷操作:
keys():返回鍵名的遍歷器
Values():返回鍵值的
Entries():返回鍵值對的遍歷器
forEach():使用回撥函式遍歷每個成員。
遍歷的應用
擴充套件運算子和Set結構結合去除陣列的重複元素
let arr = [ 3, 5, 2, 2, 5, 5];
let unique = [... new Set(arr)]; // [3, 5, 2]
實現並集、交集和差集
let a = new Set([ 1, 2, 3 ]); let b = new Set([ 4, 3, 2 ]); //交集 let intersect = new Set([ ...a ].filter( x => b.has(x))); //Set{2, 3} //並集 let union = new Set([ ...a ],[ ...b ]); //Set{1, 2, 3, 4} //差集 let difference = new Set([ ...a ].filter( x => !b.has(x))); //Set{1}
WeakSet
WeakSet結構與Set類似,也是不重複的集合。但是,它與Set有兩個區別。
- WeakSet的成員只能是物件,而不能是其他型別的值
- WeakSet中的物件都是弱引用,即垃圾回收機制不考慮WeakSet對該物件的引用,也就是說,如果其他物件都不在引用該物件,那麼垃圾回收機制會自動回收該物件所佔用的記憶體,不考慮該物件是否還存在於WeakSet之中。
WeakSet沒有size屬性,沒有辦法遍歷成員
Map
含義和基本用法
它類似於物件,也是鍵值對的集合,但是“鍵”的範圍不限於字串,各種型別的值(包括物件)都可以當做鍵。也就是說Object結構提供了“字串-值”的對應,Map結構提供了“值-值”的對應。
如果對同一鍵值賦值,後面的值將覆蓋前面的值。
Map的鍵實際上是和記憶體地址的繫結,只要記憶體地址不一樣,就視為兩個鍵。如下面的例子:
const map = new Map();
const k1 = [ ‘a’ ];
const k2 = [ ‘a’ ];
map.set(k1, 111).set(k2, 222);
map.get( k1 ) // 111
map.get( k2 ) // 222
例項的屬性和操作方法
size屬性
返回Map結構成員總數
set(key, value)
設定key對對應的鍵值,然後返回整個Map結構。
get(key)
讀取key對應的鍵值,如果找不到key,則返回undefined
has(key)
返回一個布林值,表示某個鍵值是否在Map資料結構中。
delete(key)
刪除某個鍵,返回true。如果刪除失敗,則返回false。
clear()
clear方法清除所有成員,沒有返回值。
遍歷方法
keys():返回鍵名的遍歷器
Values():返回鍵值的
Entries():返回鍵值對的遍歷器
forEach():遍歷Map的所有成員。
Map結構轉為陣列結構的比較快速的方法是結合擴充套件運算子(...)。
與其他資料結構的相互轉換
Map轉為陣列
const myMap = new Map()
.set( true, 7)
.set({ foo: 3}, [‘abc’]);
[...myMap ] // [ [ true, 7], [ { foo: 3 }, [ ‘abc’ ] ] ]
陣列轉為Map
new Map([
[ ture, 7 ],
[ {foo: 3}, [‘abc’] ]
])
Map轉為物件
function strMapToObj(strMap) {
let obj = Object.create(null);
for(let [k, v] of strMap) {
obj[k] = v;
}
return obj;
}
物件轉為Map
function ObjTostrMap(obj ) {
let strMap= new Map();
for(let k of Object.keys(obj)) {
strMap.set( k, obj[k] );
}
return strMap;
}
Map轉為JSON
function strMapToJson(strMap) {
return JSON.stringify(strMapToObj(strMap));
}
JSON轉為Map
function JsonTostrMap(JsonStr) {
return objToStrMap(JSON.parse(jsonStr));
}
WeakMap
WeakMap結構與Map結構類似,也用於生成鍵值對的集合。
WeakMap與Map的區別有兩點:
- WeakMap只接受物件作為鍵名(null除外),不接受其他型別的值作為鍵名。
- WeakMap的鍵名所指向的物件不計入垃圾回收機制。