一. 数组集合的交并差补
在数组的运算中,除了自己去重,排序等运算,数组还可以与其他的数组进行运算,一般指的是同一类型的数组,进行交并差补的集合运算,如两个数组 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); }
六. 运行之后,验证
谢谢!!!