ECMAScript 2015新增了Set
類。我們可以基於ES6的Set
開發我們的Set
類。
關於ECMAScript 6的
Set
類的實現細節,請查閱https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global-Objects/Set(或http://goo.gl/2li2a5)。
我們先看看原生的Set
類怎麼用。
還是用我們原來測試Set
類的例子:
let set = new Set;
set.add(1);
console.log(set.values); // 輸出@Iterator
console.log(set.has(1)); // 輸出true
console.log(set.size); // 輸出1
和我們的Set
不同,ES6的Set
的values
方法返回Iterator
(第2章提到過),而不是值構成的數組。另一個區別是,我們實現的size
方法返回set
中存儲的值的個數,而ES6的Set
則有一個size
屬性。
可以用delete
方法刪除set
中的元素:
set.delete(1);
clear
方法會重置set
數據結構,這跟我們實現的功能一樣。
ES6 Set
類的操作
我們的Set
類實現了並集、交集、差集、子集等數學操作,然而ES6原生的Set
並沒有這些功能。不過,有需要的話,我們也可以模擬。
我們的例子會用到下面兩個集合:
let setA = new Set;
setA.add(1);
setA.add(2);
setA.add(3);
let setB = new Set;
setB.add(2);
setB.add(3);
setB.add(4);
模擬並集操作
我們可以創建一個新的集合,用來添加兩個集合中所有的元素(行
{1}
)。迭代這兩個集合(行{2}
、行{3}
),把所有元素都添加到並集的集合中。代碼如下:let unionAb = new Set; //{1} for (let x of setA) unionAb.add(x); //{2} for (let x of setB) unionAb.add(x); //{3}
模擬交集操作
模擬交集操作需要創建一個輔助函數,來生成包含
setA
和setB
都有的元素的新集合(行{1}
)。代碼如下:let intersection = function(setA, setB) { let intersectionSet = new Set; for (let x of setA) { if (setB.has(x)) { //{1} intersectionSet.add(x); } } return intersectionSet; }; let intersectionAB = intersection(setA, setB);
交集可以用更簡單的語法實現,代碼如下:
intersectionAb = new Set([x for (x of setA) if (setB.has(x))]);
這和
intersection
函數的效果完全一樣。目前只有Firefox支持簡化的語法,但在所有支持ES6的現代瀏覽器中都可以執行
intersection
函數。模擬差集操作
交集操作創建的集合包含
setA
和setB
都有的元素,差集操作創建的集合包含的則是setA
有而setB
沒有的元素。看下面的代碼:let difference = function(setA, setB) { let differenceSet = new Set; for (let x of setA) { if (!setB.has(x)) { //{1} differenceSet.add(x); } } return differenceSet; }; let differenceAB = difference(setA, setB);
intersection
函數和difference
函數只有行{1}
不同,因為差集中只添加setA
有而setB
沒有的元素。差集也可以用更簡單的語法實現,代碼如下:
differenceAB = new Set([x for (x of setA) if (!setB.has(x))]);
目前只有Firefox支持簡化的語法,但在所有支持ES6的現代瀏覽器中都可以執行
difference
函數。