如需轉(zhuǎn)載, 請咨詢作者, 并且注明出處.
有任何問題, 可以關(guān)注我的微博: coderwhy, 或者添加我的微信: 372623326
幾乎每種編程語言中, 都有集合結(jié)構(gòu).
集合比較常見的實現(xiàn)方式時哈希表(后續(xù)會學習), 我們這里來實現(xiàn)一個封裝的集合類.
一. 集合介紹
我們先來簡單認識一下集合的特點.
集合的特點
- 集合通常是由一組無序的, 不能重復的元素構(gòu)成.
- 和數(shù)學中的集合名詞比較相似, 但是數(shù)學中的集合范圍更大一些, 也允許集合中的元素重復.
- 在計算機中, 集合通常表示的結(jié)構(gòu)中元素是不允許重復的.
- 看成一種特殊的數(shù)組
- 其實集合你可以將它看成一種特殊的數(shù)組.
- 特殊之處在于里面的元素沒有順序, 也不能重復.
- 沒有順序意味著不能通過下標值進行訪問, 不能重復意味著相同的對象在集合中只會存在一份.
集合的實現(xiàn)
- 我們要像之前學習其他數(shù)據(jù)結(jié)構(gòu)一樣, 來學習一下集合.
- 最主要的學習方式就是封裝一個屬于自己的集合類, 并且可以通過該類進行集合相關(guān)的操作.
- 2011年6月份發(fā)布的ES5中已經(jīng)包含了Array類
- 2015年6月份發(fā)布的ES6中包含了Set類, 所以其實我們可以不封裝, 直接使用它.
- 但是這里, 為了明確集合的內(nèi)部實現(xiàn)機制, 我們這里還是自己來封裝一下這個Set類.
二. 封裝集合
像前面封裝其他數(shù)據(jù)類型一樣, 我們也來封裝一下集合類(Set類)
創(chuàng)建集合類
-
我們先來封裝一個Set類
// 封裝集合的構(gòu)造函數(shù) function Set() { // 使用一個對象來保存集合的元素 this.items = {} // 集合的操作方法 }
-
代碼解析:
- 代碼就是封裝了一個集合的構(gòu)造函數(shù).
- 在集合中, 添加了一個items屬性, 用于保存之后添加到集合中的元素. 因為Object的keys本身就是一個集合.
- 后續(xù)我們給集合添加對應(yīng)的操作方法.
操作的方法
-
集合有哪些常見的操作方法呢?
-
add(value)
:向集合添加一個新的項。 -
remove(value)
:從集合移除一個值。 -
has(value)
:如果值在集合中,返回true
,否則返回false
。 -
clear()
:移除集合中的所有項。 -
size()
:返回集合所包含元素的數(shù)量。與數(shù)組的length屬性類似。 -
values()
:返回一個包含集合中所有值的數(shù)組。 - 還有一些集合其他相關(guān)的操作, 暫時用不太多, 這里暫不封裝.
-
我們來一個個實現(xiàn)這些方法, 相對都比較簡單.
-
has(value)
方法// 判斷集合中是否有某個元素 Set.prototype.has = function (value) { return this.items.hasOwnProperty(value) }
-
add
方法// 向集合中添加元素 Set.prototype.add = function (value) { // 1.判斷集合中是否已經(jīng)包含了該元素 if (this.has(value)) return false // 2.將元素添加到集合中 this.items[value] = value return true }
-
remove
方法// 從集合中刪除某個元素 Set.prototype.remove = function (value) { // 1.判斷集合中是否包含該元素 if (!this.has(value)) return false // 2.包含該元素, 那么將元素刪除 delete this.items[value] return true }
-
clear
方法// 清空集合中所有的元素 Set.prototype.clear = function () { this.items = {} }
-
size
方法// 獲取集合的大小 Set.prototype.size = function () { return Object.keys(this.items).length /* 考慮兼容性問題, 使用下面的代碼 var count = 0 for (var value in this.items) { if (this.items.hasOwnProperty(value)) { count++ } } return count */ }
-
values
方法// 獲取集合中所有的值 Set.prototype.values = function () { return Object.keys(this.items) /* 考慮兼容性問題, 使用下面的代碼 var keys = [] for (var value in this.items) { keys.push(value) } return keys */ }
集合的使用
-
我們來簡單使用和測試一下封裝的集合類
// 測試和使用集合類 var set = new Set() // 添加元素 set.add(1) alert(set.values()) // 1 set.add(1) alert(set.values()) // 1 set.add(100) set.add(200) alert(set.values()) // 1,100,200 // 判斷是否包含元素 alert(set.has(100)) // true // 刪除元素 set.remove(100) alert(set.values()) // 1, 200 // 獲取集合的大小 alert(set.size()) // 2 set.clear() alert(set.size()) // 0
三. 完整代碼
最后, 我們還是給出集合的完整代碼
-
完整代碼
// 封裝集合的構(gòu)造函數(shù) function Set() { // 使用一個對象來保存集合的元素 this.items = {} // 集合的操作方法 // 判斷集合中是否有某個元素 Set.prototype.has = function (value) { return this.items.hasOwnProperty(value) } // 向集合中添加元素 Set.prototype.add = function (value) { // 1.判斷集合中是否已經(jīng)包含了該元素 if (this.has(value)) return false // 2.將元素添加到集合中 this.items[value] = value return true } // 從集合中刪除某個元素 Set.prototype.remove = function (value) { // 1.判斷集合中是否包含該元素 if (!this.has(value)) return false // 2.包含該元素, 那么將元素刪除 delete this.items[value] return true } // 清空集合中所有的元素 Set.prototype.clear = function () { this.items = {} } // 獲取集合的大小 Set.prototype.size = function () { return Object.keys(this.items).length /* 考慮兼容性問題, 使用下面的代碼 var count = 0 for (var value in this.items) { if (this.items.hasOwnProperty(value)) { count++ } } return count */ } // 獲取集合中所有的值 Set.prototype.values = function () { return Object.keys(this.items) /* 考慮兼容性問題, 使用下面的代碼 var keys = [] for (var value in this.items) { keys.push(value) } return keys */ } }