Set 資料結構
阿新 • • 發佈:2018-11-12
ES6 提供了新的資料結構 Set。它類似於陣列,但是成員的值都是唯一的,沒有重複的值。Set 不能提供的則是索引。
let set = new Set();
set.add({});
set.size // 1
set.add({});
set.size // 2
兩個空物件不相等,所以它們被視為兩個值。
Set支援下列操作:
1、new Set:建立一個新的、空的 Set。
2、new Set(iterable):從任何可遍歷資料中提取元素,構造出一個新的集合。
3、set.size:獲取集合的大小,即其中元素的個數。
4、set.has(value):判定集合中是否含有指定元素,返回一個布林值。
5、set.add(value):新增元素。如果與已有重複,則不產生效果。
6、set.delete(value):刪除元素。如果並不存在,則不產生效果。.add()和.delete()都會返回集合自身,所以可以用鏈式語法。
7、set[Symbol.iterator]():返回一個新的遍歷整個集合的迭代器。一般這個方法不會被直接呼叫,因為實際上就是它使集合能夠被遍歷,也就是說,我們可以直接寫 for (v of set) {...}等等。
8、set.forEach(f):直接用程式碼來解釋好了,它就像是 for (let value of set) { f(value, value, set); }的簡寫,類似於陣列的.forEach()方法。
9、set.clear():清空集合。
10、set.keys()、 set.values()和 set.entries()返回各種迭代器。
Array.from
方法可以將 Set 結構轉為陣列,可以用來陣列去重。
function do(array) { return Array.from(new Set(array)); } do([1, 1, 2, 3]) // [1, 2, 3]
擴充套件運算子(...
)內部使用for...of
迴圈,所以也可以用於 Set 結構,也可以用來陣列去重。
let arr = [3, 5, 2, 2, 5, 5]; let unique = [...new Set(arr)]; // [3, 5, 2]
陣列的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}
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}