---
# System prepended metadata

title: Set 集合
tags: [JavaScript, Set]

---

# 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 轉換成陣列。
:::

 