使用JavaScript实现一个集合类

集合是一种无序的、唯一的项数据结构,在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
		}
	};

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>