集合(Sets) | Javascript

JavaScript 中, Set 是一種集合(Collection)數據類型,用於存儲唯一值,即集合中的元素不能重複。 Set 是ES6(ECMAScript 2015)引入的新數據類型之一,它提供了一種簡單而有效的方法來存儲和管理一組唯一的值。

以下是關於Set的一些關鍵特點和用法:

  • 唯一性: Set 中的元素是唯一的,即相同的值只能在集合中出現一次。如果試圖添加重複的元素, Set 會自動忽略。
  • 無序: Set 不支援透過索引直接存取元素的操作,不是像陣列(Array)一樣具有順序索引的結構。
  • 迭代:可以使用迭代器(Iterator)遍歷 Set 中的元素。

Set 操作的範例程式碼:

const mySet = new Set();

mySet.add(1);
mySet.add(2);
mySet.add(1); // 重複的元素,不會被加入

console.log(mySet); // 輸出: Set { 1, 2 }

// Set(集合)元素迭代
const mySet = new Set([1, 2, 3, 4, 5]);

for (const item of mySet) {
  console.log(item);
}

// Set(集合)的數量 
const mySet = new Set([1, 2, 3, 4, 5]);

console.log(mySet.size); // 輸出: 5


// 使用has方法檢查Set(集合)中是否包含特定元素。
const mySet = new Set([1, 2, 3, 4, 5]);

console.log(mySet.has(3)); // 輸出: true
console.log(mySet.has(6)); // 輸出: false

// 使用delete方法刪除Set(集合)中的特定元素。
const mySet = new Set([1, 2, 3, 4, 5]);

mySet.delete(3);

console.log(mySet); // 輸出: Set { 1, 2, 4, 5 }

特別注意

JavaScriptSet 中儲存物件時, Set 只會儲存物件的參考。因此,如果你在 Set 中儲存一個對象,實際上只是儲存了指向該物件的參考。當你嘗試從 Set 中取出物件時,得到的是儲存在 Set 中的引用,而不是物件的副本。

如果你希望在 Set 中實現 深拷貝 ,你需要自己實作深拷貝的邏輯。也可以使用一些函式庫(如 lodash 中的 cloneDeep 函數)或編寫自訂的深拷貝函數。以下是一個簡單的範例,使用 JSON 序列化和解析來實現深拷貝:

const mySet = new Set();

const originalObject = { key: 'value' };
const clonedObject = JSON.parse(JSON.stringify(originalObject));

mySet.add(clonedObject);

// 此時 mySet 中存儲的是 clonedObject 的副本,而不是原始的 originalObject
// 需要注意的是,使用 JSON 序列化和解析的方法有一些局限性
// 比如無法處理包含函數、RegExp 等特殊類型的對象。

總結:

Set 是一個靈活且方便的數據結構,特別適合用於保存一組唯一值的情況,這樣使得處理數據的唯一值更為簡單。