JS实现集合类

34 篇文章 1 订阅

 集合是基本的数学知识,在程序应用中也十分的常见,但是通过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的实践与学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值