在寫 Chrome插件時「插件分享,頭條文章代碼高亮,助力程序員文章分享」,剛好用到 Set 這個數(shù)據(jù)結(jié)構(gòu),所以這期就來談?wù)?Set。
什么是 Set(集合)
Set 是 ES6 中新增的一種對象類型,它存儲的是唯一值的集合。
也就是說,即使 Set 中存入相同的元素,也只會被保留一個。
Set 的創(chuàng)建
Set 的創(chuàng)建有兩種方法。
1.創(chuàng)建空集后填充元素
也可以使用鏈?zhǔn)綄懛?/p>
2.Set 構(gòu)造函數(shù)傳入可迭代對象
需要注意,當(dāng)接收字符串作為可迭代對象時,是逐個字符進(jìn)行迭代。
確定 Set 的大小
通過 .size ——
擴(kuò)展一下,為什么不是使用常見的 length?
根據(jù) ECMA-262 規(guī)范,數(shù)據(jù)集合(collection)的形式分為兩大類:
- Indexed Collection(索引集合)
- Keyed Collection(鍵集合)
像字符串、數(shù)組等屬于索引集合。它們通過索引進(jìn)行元素的訪問。這種形式的集合使用 length 確定集合大小。
而像 Map(映射),Set(集合)等是屬于鍵集合。它們通過鍵來進(jìn)行元素的訪問。這種形式的集合使用 size 來確定集合的大小。
Set 新增元素
通過 .add(),并且可以鏈?zhǔn)讲僮?——
Set 刪除元素
通過 .delete() ——
檢查 Set 中是否存在某個元素
通過 .has() ——
清空 Set 中元素
通過 .clear() ——
Set 的迭代操作
Set 屬于可迭代對象,迭代順序是基于插入的順序。所以,它也存在可迭代對象的一些方法。
1.遍歷 Set
使用 .forEach()
作為可迭代對象,也可以使用 for of 進(jìn)行遍歷
2.迭代方法
根據(jù) ECMA-262 定義,Set 的迭代過程類似于具有相同鍵值對的 Map。
For iteration purposes, a Set Appears similar to a Map where each entry has the same value for its key and value.
所以,Set 中的 .keys() 與 .values() 的 返回相同。均返回一個迭代器對象,包含 Set 中的按插入順序排列的所有元素的值。
而鍵值對 .entries() 返回的迭代器對象,包含 Set 中的按插入順序排列的所有元素的值的 [value, value] 數(shù)組。
常用場景
數(shù)組去重
除了這個使用場景外,日常中很少有使用 Set 的地方。
部分原因在于,與提供了很多內(nèi)置方法的數(shù)組 Array 相比,Set 的內(nèi)置方法還是偏少。例如:基本的交集,并集等操作都沒有提供。
因此,下期我們就對 Set 進(jìn)行一個擴(kuò)展,手把手將它改造成更加實用的結(jié)構(gòu)。不妨先收藏加關(guān)注。