重學ES6 Set 數據結構(1)

Set數據結構相似於數組,可是成員的值都是惟一的,沒有重複。javascript

Set自己是一個構造函數,用來生成Set數據結構。java

Set 結構不會添加劇復的值。算法

const s = new Set();
[2,3,5,4,4,2,2].froEach(x => s.add(x));

for(let i of s) {
    console.log(i)
}
// 2 3 4 5
複製代碼

Set函數接受一個數組(或者具備 iterable接口的其餘數據結構)做爲參數。數組

// example 1
const set = new Set([1,2,3,4,4]);
[...set]
// [1,2,3,4]

// example 2
const items = new Set([1,2,3,4,5,5,5,5]);
items.size // 5

// example 3
function divs(){
    return [...document.querySelectorAll('div')]
}
const set = new Set(divs());
set.size // 60

//相似於
divs().forEach(div => set.add(div))
複製代碼

數組去重的方法 [...new Set(array)]數據結構

注意:向Set加入值時,不會發生類型轉換,因此 5 和 「5」 是兩個不一樣的值。Set內部判斷兩個值是否相同使用的算法叫作「Same-value equality」相似於「===」,主要區別在於 NaN等於自身,而 精確相等認爲 NaN 不等於自身。函數

另外,兩個對象老是不相等的。ui

let set = new Set();
set.add({});
set.size // 1
set.add({})
set.size // 2
複製代碼

Set 實例的屬性和方法

屬性

Set.prototype.constructor: 構造函數spa

Set.prototype.size: Set 實例的成員總數prototype

方法

add(value) :添加某個值,返回set結構自己code

delete(value) :刪除某個值,返回布爾值,表示是否成功

has(value):返回布爾值,表示參數是否爲Set成員

clear(value):清除全部成員,沒有返回值。

// 對象寫法
const properties = {
    'width' : 1,
    'height': 1
}

if(properties[someName]){
    // do something
}

//Set 寫法
const properties = new Set();
properties.add('width');
properties.add('height');

if(properties.has(someName){
    // do something
}
複製代碼

Array.from方法將Set轉化爲數組。

const items = new Set([1,2,3,4,5]);
const array = Array.from(items);

// 去除數組重複元素的方法
function dedupe(array){
    return Array.from(new Set(array))
}

dedupe([1,2,3,3,2]); // [1,2,3]
複製代碼

遍歷操做

  • keys()
  • values()
  • entries()
  • forEach()

特別指出:Set遍歷順序就是插入順序。好比可使用Set保存一個回調函數列表,調用時,就能夠按照添加順序來調用。

keys,values,entries 方法都是返回遍歷器對象。因爲Set沒有鍵名,只有鍵值,(或者說是 鍵名和鍵值是同樣的),因此,keys和values方法的行爲徹底一致。

let set = new Set(['red','green','blue']);
for(let item of set.keys()){
    console.log(item)
}
// red
// green
// blue

let set = new Set(['red','green','blue']);
for(let item of set.values()){
    console.log(item)
}
// red
// green
// blue

let set = new Set(['red','green','blue']);
for(let item of set.entries()){
    console.log(item)
}
// ["red","red"]
// ["green","green"]
// ["blue","blue"]
複製代碼

能夠直接用 for ... of 循環遍歷Set。

forEach()

set 結構的 forEach 對於每一個成員執行操做,沒有返回值。

let set = new Set([1,2,3])
set.forEach((value,key) => console.log(value * 2))
複製代碼

遍歷的應用

擴展運算符(...)內部使用 for of 循環,因此也能夠用於Set結構。

let set = new Set(['red','green','blue'])
let arr = [...set]
//['red','green','blue']
複製代碼

擴展運算符(...)結合set,就能夠進行數組去重

let arr = [1,2,3,2,5,3,4,5]
let unique = [... new Set(arr)]
// [1,2,3,4,5]
複製代碼

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結構,很容易實現 並集,交集,差集

let a = new Set([1,2,3])
let b = new Set([4,3,2])
//並集
let union = new Set([...a,...b])
//交集
let intersect = new Set([...a].filter(x => b.has(x)))
//差集
let difference = new Set([...a].filter(x => !b.has(x)))
複製代碼

若是想在遍歷操做中,同步改變原來的Set結構,沒有直接的辦法。只能變通一下,一種是利用原來的Set結構映射一個新的結構,而後賦值給原來的Set結構,另外一種就是Array.from

//1
let set = new Set([1,2,3])
set = new Set([...set].map(val => val*2)

//2
let set = new Set([1,2,3])
set = new Set(Array.from(set,val => val*2))
複製代碼
相關文章
相關標籤/搜索