一、集合
集合是什么?
1.几乎每种编程语言中,都有集合结构
2.集合比较常见的实现方法是哈希表
3.集合通常是一组无须、不能重复的元素构成
4.和数学中的集合名词比较相似,但是数学中的集合范围更大一些,也允许集合中的元素重复
5.在计算机中,集合通常表示的结构中元素是不允许重复的
集合和数组比较:集合是特殊的数组
1.特殊之处在于里面的元素没有顺序,也不能重复
2.没有顺序意味不能通过下标值进行访问,不能重复意味着相同对象在集合中只会存在一份
1.ES6中的Set
javascript中也有集合结构:Set
Set是ES6新的数据结构,类似数组。Set对象是值的集合,你可以按照插入的顺序迭代它的元素。
Set中的元素只会出现一次,即 Set 中的元素是唯一的。
let set = new Set()
set.add(1)
set.add(2)
set.add(2)
set.add(3)
for(let item of set){
console.log(item) //1,2,3
}
set.delete(1) //删除元素
set.has(2) //true,判断是否存在该元素
接收一个数组用来初始化
let s=new Set([1,2,3,3])
[...s] //1,2,3
依照集合中元素不会出现重复的特性,我们可以用Set来实现数组去重
var arr = [1,2,2,6,3,2,4,6]
Array.from(new Set(arr)) //[1,2,6,3,4]
2.封装Set类
我们也可以自己手动封装一个简单的Set类
代码如下(示例):
function Set() {
//集合数据存放
this.items = {}
//添加元素进入集合
Set.prototype.add = function(value) {
if(this.has(value)) {
return false
}
this.items[value] = value
return true
}
//has,判断集合中是否存在元素
Set.prototype.has = function(value) {
return this.items.hasOwnPeoperty(value)
}
//remove
Set.prototype.remove = function(value) {
if(this.has(value)) {
return false
}
//删除元素
delete this.itmes[value]
return true
}
//clear
Set.prototype.clear = function() {
this.items = {}
}
//size
Set.prototype.size = function() {
return Object.keys(this.items).length
}
//values
Set.prototype.values = function() {
return Object.keys(items)
}
}
测试:
var set = new Set()
set.add(10)
set.add(20)
set.add(10)
alert(set.values())
二、实现基本集合操作
1.并集
代码如下(示例):
//union ,求两个集合的并集,并返回一个新集合
Set.prototype.union = function(otherSet) {
var unionSet = new Set()
var values = this.values()
for(var i = 0; i < values.length; i++){
unionSet.add(values[i])
}
var otherValues = otherSet.values()
for(var i = 0; i < otherValues.length; i++){
unionSet.add(otherValues[i])
}
return unionSet
}
测试:
var set = new Set()
set.add(1)
set.add(2)
set.add(3)
var set1 = new Set()
set1.add(1)
set1.add(3)
set1.add(4)
set1.add(7)
console.log(set.union(set1)) // [1,2,3,4,7]
2.并集
//intersectionSet,求两个集合的交集,并返回一个新的集合
Set.prototype.intersection = function(otherSet) {
//创建一个新的空的集合
var intersectionSet = new Set()
var values = this.values()
for(var i = 0; i < values.length; i++) {
if(otherSet.has(values[i])){
intersectionSet.add(values[i])
}
}
return intersectionSet
}
测试:
var set = new Set()
set.add(1)
set.add(2)
set.add(3)
var set1 = new Set()
set1.add(1)
set1.add(3)
set1.add(4)
set1.add(7)
console.log(set.intersection(set1)) // [1,3],
3.差集
//differenceSet,求两个集合的差集,并返回一个新的集合
Set.prototype.difference = function(otherSet) {
//创建一个新的空的集合
var differenceSet = new Set()
var values = this.values()
for(var i = 0; i < values.length; i++) {
if(!otherSet.has(values[i])){
differenceSet.add(values[i])
}
}
return intersectionSet
}
测试:
var set = new Set()
set.add(1)
set.add(2)
set.add(3)
var set1 = new Set()
set1.add(1)
set1.add(3)
set1.add(4)
set1.add(7)
console.log(set.difference(set1)) // [2]
4.子集
//subset, s2.subset(s1) 判断是s1是不是s2的子集
Set.prototype.subset = function(otherSet) {
var len = otherSet.values()
var values = this.values()
if(len > values.length){
return fasle
}
for(var i =0; i < len.length; i++){
if(!this.has(len[i])){
return false
}
}
return true
}
测试:
var set = new Set()
set.add(1)
set.add(2)
set.add(3)
var set1 = new Set()
set.add(1)
set.add(2)
console.log(set.subset(set1)) // true