集合是一组无序且唯一(即不能重复)的项组成的。
1.创建一个集合
function Set(){
this.items = {};
if(Set.prototype.has != 'function'){
//判断集合是否有某值
Set.prototype.has = function(value){
return this.items.hasOwnProperty(value)
};
//向集合中添加元素
Set.prototype.add = function(value){
if(!this.has(value)){
this.items[value] = value;
return true;
}
return false;
};
//移除集合中某个元素
Set.prototype.remove = function(value){
if(this.has(value)){
delete this.items[value];
}
return false;
};
//清空集合
Set.prototype.clear = function(){
this.items = {};
};
//获取集合有多少项
Set.prototype.size = function(){
return Object.keys(this.items).length;
}
//获取集合的所有项,以数组返回
Set.prototype.values = function(){
return Object.keys(this.items);
}
}
}
(1)首先要写一个has()方法,判断Set中是否有某个元素,这个会被remove()和add()方法使用。因为,没有这个元素不能删除,Set中无重复元素(不能添加重复元素)。
(2)因为items是对象,删除对象的属性,直接用delete就好了
(3)hasOwnProperty()判断实例自身(不属于原型对象)是否有某个的属性
(4)Object.keys()获取实例自身(不属于原型对象)的所有可枚举属性
补充
(5)getOwnPropertyNames()返回实例的所有属性,无论是否可枚举。
(6)for…in…,只不返回原型对象中的不可枚举属性
2.使用Set类
var set = new Set();
set.add(1);
set.add(2);
set.add(3);
console.log(set.values()); //["1","2","3"]
console.log(set.values()); //["1","2","3"]
console.log(set.has(1)); //true
console.log(set.size()); //3
set.remove(2);
console.log(set.values()); //["1","3"]
console.log(set.remove(4)); //false
console.log(set.values()); //["1","3"]
set.clear();
console.log(set.values()); //[]
3.Set操作——交,并,差
//交
Set.prototype.union = function(otherSet){
var unionSet = new Set();
var values = this.values();
console.log(values);
for(var i = 0;i < values.length;i++){
unionSet.add(values[i]);
}
values = otherSet.values();
for(var i = 0;i < values.length;i++){
unionSet.add(values[i]);
}
return unionSet;
};
//并
Set.prototype.intersection = function(otherSet){
var intersection = new Set();
var values = this.values();
for(var i = 0;i < values.length;i++){
if(otherSet.has(values[i])){
intersection.add(values[i]);
}
}
return intersection;
};
//差
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 differenceSet;
}
测试结果
var set = new Set();
set.add(1);
set.add(2);
set.add(3);
var set1 = new Set();
set1.add(1);
set1.add(4);
set1.add(5);
var unionSet = set.union(set1);
console.log(unionSet.values()); //["1", "2", "3", "4", "5"]
var intersection = set.intersection(set1);
console.log(intersection.values()); //["1"]
var differenceSet = set.difference(set1);
console.log(differenceSet.values()); //["2", "3"]