6.集合
常见的实现方式是哈希表(后续学习),在这主要以封装集合类来实现。在2015年6月发布的es6中已经 包含了set类,所以在这里通过手动封装让我们了解set类内部实现机制。
注意:本内容主要探讨集合有哪些方法,其兼容问题是不包含在本节所要讲的内容中
6.1集合特点
-
是一组无序的,不重复的元素构成
-
意味着不能通过下标值进行访问,相同的对象在集合中是不能重复的,只存在一份
6.2集合的常见操作
-
add(value):向集合添加一个新的项
-
remove(value):从集合移除一个值
-
has(value):判断某个值是否在集合中。如果值在集合中,返回true,否则返回false
-
clear():移除集合中的所有项
-
size():返回集合所包含元素的数量
-
values():返回一个包含集合中所有值的数组
6.3集合操作的实践
6.3.1集合整体实现预览
function Set(){
//属性
this.items = {}//object对象,对象的keys本身为一个set类
Set.prototype.has = function (value) {}
Set.prototype.add = function (value) {}
Set.prototype.remove = function (value) {}
Set.prototype.clear = function () {}
Set.prototype.size = function () {}
Set.prototype.values = function () {}
}
6.3.2has方法
Set.prototype.has = function (value) {
return this.items.hasOwnProperty(value)//当前对象里面是否包含某个键
}
6.3.3add方法
Set.prototype.add = function (value) {
//判断当前集合中是否已经包含了该元素
if (this.has(value))
return false
this.items[value] = value
return true
}
6.3.4remove方法
Set.prototype.remove = function (value) {
//判断该集合中是否包含该元素
if (this.has(value)) {
delete this.items[value]//将元素从对象中删除
return true
}
return false
}
6.3.5clear方法
Set.prototype.clear = function () {
this.items = {}
}
6.3.6size方法
Set.prototype.size = function () {
return Object.keys(this.items).length//获取对象中keys的个数
}
6.3.7values方法
Set.prototype.values = function () {//获取集合的值
return Object.values(this.items)
}
6.4集合的数学操作
6.4.1集合并集
对于给定的两个集合,返回一个包含两个集合中所有元素的新集合
解题思路:
-
先创建一个新集合,代表两个集合的并集
-
遍历集合A中所有值,并添加到新集合中
-
遍历集合B中所有值 ,并添加到新集合中
-
将最终新集合返回
Set.prototype.union = function (setB) {
var setC = new Set()
for (var i in this.items) {
setC.add(this.items[i])
}
for (var j in setB.items) {
setC.add(setB.items[j])
}
return setC
}
6.4.2集合交集
对于给定的两个集合,返回一个包含两个集合中共有元素的新集合
解题思路:
-
首先创建一个新集合,代表两个集合的并集
-
遍历集合A中所有的值,判断该元素是否在集合B中
-
在集合B中则将该元素加入到新集合
-
最后将新集合返回
Set.prototype.intersection = function (setB) {
var setC = new Set()
for (var i in this.items) {
if (setB.has(this.items[i])) {
setC.add(this.items[i])
}
}
return setC
}
6.4.3集合差集
对于给定的两个集合,返回一个包含所有存在于第一个集合且不存在于第二个集合的元素的新集合
解题思路:
-
首先创建一个新集合
-
遍历集合A中所有元素,判断是否在集合B中
-
不存在于集合B中,将该元素添加到新集合中
-
最后将新集合返回
Set.prototype.difference = function (setB) {
var setC = new Set()
for (var i in this.items) {
if (!setB.has(this.items[i])) {
setC.add(this.items[i])
}
}
return setC
}
6.4.4集合子集
验证一个给定集合是否是另一集合的子集,A里面的元素都包含在B中
解题思路:
-
判断集合A是否大于集合B如果大于,那么 肯定不是集合B的子集
-
不大于的情况下:
-
判断集合A中的元素是否都在集合B中存在
-
存在返回true,不存在则返回false
-
Set.prototype.subset = function (setB) {
var setC = new Set()
if (this.values().length >setB.values().length) return false
for (var i in this.items) {
if (!setB.has(this.items[i])) {
return false
}
}
return true
}