Set
ES6 提供了新的數據結構 Set。它類似於數組,但是成員的值都是唯一的,沒有重復的值。
很多時候我們把Set叫做 集合,但是,Set可以是集合,集合不一定是Set。
特性:唯一性=>不重復=>能夠對數據進行去重操作。
注:集合去重,是全等匹配,===。
創建Set
Set 本身是一個構造函數,調用構造函數用來生成 Set 數據結構。
關鍵詞 標識符 = new Set();
例 let i = new Set();
Set 函數可以接受一個數組(或類似數組的對象)作為參數,用來進行數據初始化。
let i = new Set([1, 2, 3, 4, 4]); 會得到 set{1, 2, 3, 4,}
注:如果初始化時給的值有重復的,會自動去除。
集合並沒有字面量聲明方式。
Set的屬性
常用的屬性就一個:size 返回 Set 實例的成員總數。
let s = new Set([1, 2, 3]);
console.log( s.size ); // 3
Set的方法
Set 實例的方法分為兩大類:操作方法(用於數據操作)和遍歷方法(用於遍歷數據)。
操作方法:
add(value) 添加數據,並返回新的 Set 結構
delete(value) 刪除數據,返回一個布爾值,表示是否刪除成功
has(value) 查看是否存在某個數據,返回一個布爾值
clear() 清除所有數據,沒有返回值
let set = new Set([1, 2, 3, 4, 4]); // 添加數據 5 let addSet = set.add(5); console.log(addSet); // Set(5) {1, 2, 3, 4, 5} // 刪除數據 4s let delSet = set.delete(4); console.log(delSet); // true // 查看是否存在數據 4 let hasSet = set.has(4); console.log(hasSet); // false // 清除所有數據 set.clear(); console.log(set); // Set(0) {}
遍歷方法:
Set 提供了三個遍歷器生成函數和一個遍歷方法。
keys() 返回一個鍵名的遍歷器
values() 返回一個鍵值的遍歷器
entries() 返回一個鍵值對的遍歷器
forEach() 使用回調函數遍歷每個成員
let color = new Set(["red", "green", "blue"]); for(let item of color.keys()){ console.log(item); } // red // green // blue for(let item of color.values()){ console.log(item); } // red // green // blue for(let item of color.entries()){ console.log(item); } // ["red", "red"] // ["green", "green"] // ["blue", "blue"] color.forEach((item) => { console.log(item) }) // red // green // blue
與數組相關操作
Set 轉數組:
由於擴展運算符...,內部的原理也是使用的 for-of 循環,所以也可以用於操作 Set 結構。
例如將 Set 結構轉換為數組結構:
let color = new Set(["red", "green", "blue"]); let colorArr = [...color];
數組去重:
擴展運算符和 Set 結構相結合,就可以去除數組的重復成員。
let arr = [1,2,2,2,2,"2",24,5,6]; //step1:數組轉集合 let set = new Set(arr);//已經去掉重復值,當前不是數組,而集合 Set { 1, 2, '2', 24, 5, 6 } //step2:集合轉數組 arr = [...set];//[ 1, 2, '2', 24, 5, 6 ]
擴展
let num1 = new Set([1, 2, 3, 4]); let num2 = new Set([3, 4, 5, 6]); //並集 let union = new Set([...num1,...num2]); console.log(union);//Set { 1, 2, 3, 4, 5, 6 } //交集 let intersect = new Set( [...num1].filter(x=> num2.has(x)) ) console.log(intersect); //Set { 3, 4 } //差集 let difference = new Set( [...num1].filter(x => !num2.has(x)) ) console.log(difference); //Set { 1, 2 }