讀古今文學網 > 學習JavaScript數據結構與算法(第2版) > 6.4 ES6Set類 >

6.4 ES6Set類

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的Setvalues方法返回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. 模擬並集操作

    我們可以創建一個新的集合,用來添加兩個集合中所有的元素(行{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}
      
  2. 模擬交集操作

    模擬交集操作需要創建一個輔助函數,來生成包含setAsetB都有的元素的新集合(行{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函數。

  3. 模擬差集操作

    交集操作創建的集合包含setAsetB都有的元素,差集操作創建的集合包含的則是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函數。