# Set 集合 ###### tags: `JavaScript` `Set` > Set 是 ES6 新增的一種資料型態,類似陣列,但其所有的值都是唯一的 (**==unique values==**),不會有重複的值。 在 Set 加入新的元素時,其內部會用 === 判斷是否有重複,當判定為重複(duplicate values)時,會忽略其值。 :::info 雖然 **NaN !== NaN** ,但 Set 會判斷為重複的值。 ::: #### 基本建置 Set ```javascript= // 建立一個 Set 物件 const mySet = new Set(); // 新增 Set 內數值 mySet.add(1) // {1} mySet.add(1) // {1} 重複傳值 mySet.add(2) // {1,2} mySet.add(3) // {1,2,3} mySet.add({ foo: 'bar' }); // { 1, 2, 3,{ foo: 'bar' } } // 刪除 Set 內數值 mySet.delete(2) // [ 1, 3,{ foo: 'bar' } ] // 當直接以參數的方式將資料傳入 Set 時 const mySet = new Set([1, 1, 2, 3, 4]); console.log(mySet) // {1,2,3,4} 不會直接傳入一個陣列 會一個一個傳入 set ``` #### 應用:比較陣列中是否包含某個值 > 如果想快速判斷一個陣列裡面是否包含某個值,可以使用 Set 集合的 `has` 方法。 ```javascript= mySet.has(1) // true mySet.has({ foo: 'bar' }) // false ``` :::warning 由於物件的值是以 Ref 的方式被記錄,當 Set 在比較兩個物件時,即使裡面的內容一致,也會因為 Ref 不同,而判定為 false。 ::: #### 應用:過濾陣列中重複的元素 ```javascript= const arr = [1, 1, 3, 5, 5, 7]; const arrToSet = new Set(arr); // Set { 1, 3, 5, 7 } const uniqueArray = [...arrToSet]; // [ 1, 3, 5, 7 ] ``` :::warning 使用 ES6 的 Spread Operator,可以將 Set 轉換成陣列。 :::