1. 程式人生 > >輕鬆上手使用ES6中的Set和Map資料結構

輕鬆上手使用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有兩個區別。

  1. WeakSet的成員只能是物件,而不能是其他型別的值
  2. 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的區別有兩點:

  1. WeakMap只接受物件作為鍵名(null除外),不接受其他型別的值作為鍵名。
  2. WeakMap的鍵名所指向的物件不計入垃圾回收機制。