JS数组的交并差补运算(二十三)

古语有云: 万恶淫为首,百善孝为先。 我们后辈当自勉。

上一章简单介绍了JS对象数组的排序(二十二),如果没有看过,请观看上一章

一. 数组集合的交并差补

在数组的运算中,除了自己去重,排序等运算,数组还可以与其他的数组进行运算,一般指的是同一类型的数组,进行交并差补的集合运算,如两个数组 A,B. 交集指的是,两个数组 A,B之间共同拥有的数据, 并集指的是两个数组 A,B 所有的数据, 差集指的是,数组A中拥有的,B没有的数据,即A特有的数据。 补集指的是,数组A中没有的,数组B特有的数据。

其中,均用到数组的去重。 关于数组的去重,可以参考老蝴蝶以前写的文章: JS的数组去重处理(十九)

为了方便运用,这儿直接引用代码。

数组去重的代码

Array.prototype.unique=function(){
	//必须先进行排序
	this.sort();
	var newArr=new Array();
	//放入第一个数组头数据。
	var temp=this[0];
	newArr.push(temp);
	for(var i=1;i<this.length;i++){
		if(temp!=this[i]){ //判断数组中,是否拥有该值。
			temp=this[i]; //放置到数组里面。
			newArr.push(this[i]);
		}
	}
	return newArr;
}

定义两个数组集合。 老蝴蝶这儿只用简单的数据,不用对象数组等复杂数据。

var arrA=[1,2,3,4,5];

var arrB=[3,4,5,6,7];

前端验证代码:


var arrA=[1,2,3,4,5];

var arrB=[3,4,5,6,7];


console.log("并集:"+arrA.union(arrB).toString());
console.log("交集:"+arrA.intersect(arrB).toString());
console.log("差集:"+arrA.minus(arrB).toString());
console.log("补集:"+arrA.complement(arrB).toString());

二. 并集 union() 方法

直接将两个数组连接起来,然后去重即可。 连接用 concat() 方法。

/**
 * 
 * @param another
 * @returns 两个数组求并集
 */
Array.prototype.union=function(another){
	return this.concat(another).unique(); //连接之后去重
}

三. 交集 intersect() 方法。

交集,需要遍历主的数组,即A数组,然后判断一下 A中的每一个数据,是否在 B数组中。 如果有的话,就放置在交集集合里面,属于两个集合的共同元素。

/**
 * 
 * @param another
 * @returns 两个数组求交集
 */
Array.prototype.intersect=function(another){
	var newArr=[];
	
	if(another==[]||another.length==0){ //如果传入进来的是空数组,就返回原数组。
		newArr=this.concat();
		return newArr;
	}
	//为了避免对原数组造成破坏,这里新创建一个数组。
	var clone=this.concat(); 
	clone.sort(); //排序
	for(var i=0,len=clone.length;i<len;i++){
		var num=clone[i];
		var flag=true;
		for(var j=0,length=another.length;j<length;j++){
			if(num==another[j]){
				flag=false;
				break; //相同,就结束循环。
			}
		}
		if(!flag){ //一样的话,才放置。
			newArr.push(num);
		}
	}
	return newArr;
}

四 差集 minus() 方法。

与交集差不多,只是如果不存在B 数组中,才放置到差集的集合里面。

/**
 * 
 * @param another
 * @returns 两个数组求差集,保留调用者数组里面的值
 */
Array.prototype.minus=function(another){
	var newArr=[];
	
	if(another==[]||another.length==0){ //如果传入进来的是空数组,就返回原数组。
		newArr=this.concat();
		return newArr;
	}
	//为了避免对原数组造成破坏,这里新创建一个数组。
	var clone=this.concat(); 
	clone.sort();
	for(var i=0,len=clone.length;i<len;i++){
		var num=clone[i];
		var flag=true;
		for(var j=0,length=another.length;j<length;j++){
			if(num==another[j]){
				flag=false;
				break; //相同,就结束循环。
			}
		}
		if(flag){ //不一样
			newArr.push(num);
		}
	}
	return newArr;
}

五. 补集 complement() 方法

利用数学公式, 补集=并集-差集。

/**
 * 
 * @param another
 * @returns 两个数组求补集,返回 another 数组中特有的元素。
 */
Array.prototype.complement=function(another){
	//按照数学上规则,为 :  AUB -A
	var clone=this.concat();
	return clone.union(another).minus(this);
}

六. 运行之后,验证

有图片。

谢谢!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

两个蝴蝶飞

你的鼓励,是老蝴蝶更努力写作的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值