集合是基本的数学知识,在程序应用中也十分的常见,但是通过js实现集合在网上查了下并不是很多,有些也是使用比较传统的方法实现,当然不是说传统的方法有什么缺点,传统方法兼容性更好
我发现在ES6中天然适合做集合的Set类,由于Set具有元素唯一性,这个特性也正是集合的最基本特性之一,因此能够用简洁的代码实现类的抽象
类常见的运算有查找、增加、删除、合集、并集、差集、子集等等操作,通过Set十分方便的实现这些功能,一下是实现简单集合类的代码
/**
* 集合类
*/
export default class aggregate {
//构造函数
constructor(array) {
let _init = array instanceof Array ? array : null;
this._set = new Set(_init);
}
//集合新增
add(newElement) {
this._set.add(newElement);
return this.getValues();
}
/**
* 集合是否包含
* @param {[type]} element [description]
* @return {Boolean} [是否包含该元素]
*/
has(element) {
return this._set.has(element);
}
//集合删除指定项
remove(element) {
this._set.delete(element);
return this.getValues();
}
//集合清空
clear() {
this._set.clear();
}
/**
* 集合大小,可判断是否为空集
* @return {Number} [集合大小]
*/
size() {
return this._set.size;
}
/**
* 集合内容
* @return {Array} [集合内容数组]
*/
getValues() {
return [...this._set];
}
/**
* 并集,两个集合的所有元素
* @param {[type]} otherSet [目标集合]
* @return {Set} [并集]
*/
union(otherSet) {
return new Set([...this._set,...otherSet.getValues()]);
}
/**
* 交集,共同拥有的元素
* @param {[type]} otherSet [目标集合]
* @return {Set} [交集]
*/
intersection(otherSet) {
return new Set(this.getValues().filter((val) => otherSet.has(val)));
}
/**
* 差集
* @param {[type]} otherSet [目标集合]
* @return {Set} [差集]
*/
difference(otherSet) {
return new Set(this.getValues().filter(val => !otherSet.has(val)));
}
/**
* 子集
* @param {[type]} otherSet [目标集合]
* @return {Boolean} [目标集合是否为其子集]
*/
isSubset(otherSet) {
let _isSubset = otherSet.getValues().every(val => this._set.has(val));
return _isSubset;
}
/**
* 相等
* @param {[type]} otherSet [目标集合]
* @return {Boolean} [与目标集合是否相等]
*/
isEqual(otherSet) {
let _subset1 = this.isSubset(otherSet);
let _subset2 = this.getValues().every(val => otherSet.has(val));
return _subset1 && _subset2;
}
}
以上只是简单的实现集合类的抽象,以上只是考虑到两个集合之间的操作,还可以更深度的考虑兼容多个集合的操作,比如大于两个集合的合集等,还有一些没有实现的集合方法,比如补集等,在此只是简单地使用Set类,集合类也是十分适合Set的实践与学习