集合是一种无序的、唯一的项数据结构,在ES6中提供了原生的set类。现在我们使用ES5实现一个set类。
//基于对象实现一个Set类
function Set() {
//使用对象表示
var items = {};
//判断集合中是否含有某个元素,有返回ture,否则返回false
this.has = function(value){
return items.hasOwnProperty(value);
};
//添加一个元素
this.add = function(value){
if (!this.has(value)){//如果已经有了该元素,不添加,因为各项是唯一的
items[value] = value; //key和value一样
return true;
}
return false;
};
//移除一个一个元素
this.remove = function(value){
if (this.has(value)){
delete items[value]; //使用delete删除对象的一个属性
return true;
}
return false;
};
//清空集合
this.clear = function(){
items = {}; // 直接置空对象
};
//获取集合的大小,实际就是查找对象有多少属性
this.size = function(){
return Object.keys(items).length; //使用object的keys方法,keys返回一个所有属性集合的数组
};
//提取所有的集合属性
this.values = function(){
return Object.keys(items);//使用keys方法,返回属性的数组
};
//提取AB两个集合的交集,接收一个B的集合
this.intersection = function(otherSet){
var intersectionSet = new Set(); //创建一个新的集合,用来表示两个集合的交集
var values = this.values();//提取A集合的属性
for (var i=0; i<values.length; i++)
{ //遍历A集合的value
if (otherSet.has(values[i])){ //判断B集合有没有当前元素
intersectionSet.add(values[i]); //如果有,将该属性添加到新的集合里
}
}
return intersectionSet;
}
//并集,合并AB两个集合的元素,接收一个B的集合
this.union = function(otherSet){
var unionSet = new Set(); //创建一个新的集合,用来表示连个集合的并集
var values = this.values(); //提取A集合的属性
for (var i=0; i<values.length; i++)
{ //遍历A集合,将A集合的元素添加到新的集合里
unionSet.add(values[i]);
}
values = otherSet.values(); //提取B集合的属性
for (var i=0; i<values.length; i++)
{
//遍历B集合,将B集合的元素添加到新的集合里
unionSet.add(values[i]);
}
//返回新集合,并集
return unionSet;
};
//差集,A-B,接收一个B集合,提取在A的元素,并且不在B的元素
this.difference = function(otherSet){
var differenceSet = new Set(); //创建一个新集合,用于接收差集的元素
var values = this.values();//提取A集合的元素
for (var i=0; i<values.length; i++)
{ //遍历A集合的元素
if (!otherSet.has(values[i]))
{ //判断B集合中是否含有该元素,如果没有,将该元素添加到新的差集里
differenceSet.add(values[i]);
}
}
return differenceSet;
};
//子集,判断A是不是B的子集,接收一个B集合,返回ture或者false
this.subset = function(otherSet){
if (this.size() > otherSet.size())
{ //判断A的大小是不是大于B,如果大于,A就不可能是B的子集
return false;
}
else
{
var values = this.values();//提取A集合的元素
for (var i=0; i<values.length; i++)
{ //遍历A集合的元素
if (!otherSet.has(values[i]))
{
return false; //如果存在元素不在B集合中,说明A不是B的子集,返回false
}
}
}
return true; //如果都存在,则说明A是B的子集,返回ture
}
};
}