// 基于对象封装一个集合
function Set() {
// 属性
this.items = {};
// ------------------方法-----------------
// add 往集合中添加元素
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.hasOwnProperty(value)
}
// remove 删除集合中的这个元素
Set.prototype.remove = function (value) {
// 先判断是否有这个元素
if (!this.has(value)) return false;
// 有的话删除
delete this.items[value];
return true
}
// clear 删除集合中的所有元素
Set.prototype.clear = function(){
this.items = {};
return true
}
// size 获取集合的长度
Set.prototype.size = function(){
return Object.keys(this.items).length
}
// values 获取集合中的所有元素
Set.prototype.values = function(){
return Object.values(this.items)
}
// -----集合间的操作----
// 并集
Set.prototype.union = function(otherSet){
// this 代表集合A
// otherSet 代表集合B
// 1.先创建一个unionSet
let unionSet = new Set()
// 2.将集合A中的元素放到unionSet中
var values = this.values();
for(let i = 0; i < values.length; i++){
unionSet.add(values[i])
}
// 3.判断集合B中的元素在unionSet中是否存在,没有的话就加进去
values = otherSet.values();
for(let i = 0; i < values.length; i++){
unionSet.add(values[i])
}
// 4.返回unionSet集合
return unionSet
}
// 交集
Set.prototype.intersection = function(otherSet){
// 1.创建一个新的集合
let intersectionSet = new Set();
// 2.遍历集合A,判断其元素在集合B中是否存在,存在就存到交集集合中
var values = this.values();
for(let i = 0; i < values.length; i++){
if(otherSet.has(values[i])){
intersectionSet.add(values[i])
}
}
return intersectionSet
}
// 差集
Set.prototype.difference = function(otherSet){
// 1.创建一个新的集合
let differenceSet = new Set();
// 2.遍历集合A,判断其元素在集合B中是否存在,不存在就存到差集集合中
var values = this.values();
for(let i = 0; i < values.length; i++){
if(!otherSet.has(values[i])){
differenceSet.add(values[i])
}
}
return differenceSet
}
// 子集 判断A是否是B的子集
Set.prototype.subSet = function(otherSet){
// 遍历集合A,判断其元素在集合B中是否存在,只要有一个不存在就代表A不是B的子集
var values = this.values();
for(let i = 0; i < values.length; i++){
if(!otherSet.has(values[i])){
return false
}
}
return true
}
}
// ----------------------测试-------------------
// let set = new Set();
// set.add(12);
// set.add('好看');
// set.add(34);
// set.add('美女');
// console.log(set);
// console.log(set.values());
// console.log(set.size());
// console.log(set.has(34));
// console.log(set.has(00));
// console.log(set.remove(34));
// console.log(set.values());
// console.log(set.clear());
// console.log(set.values());
let setA = new Set();
setA.add(1);
setA.add(2);
setA.add(3);
let setB = new Set();
setB.add(3);
setB.add(4);
setB.add(5);
let setC = new Set();
setC.add(1);
setC.add(2);
console.log(setA.union(setB).values());
console.log(setA.intersection(setB).values());
console.log(setA.difference(setB).values());
console.log(setC.subSet(setA)); // true C是A的子集
console.log(setA.subSet(setB)); // false A不是B的子集