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

上一章简单介绍了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);
}

六. 运行之后,验证

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

谢谢!!!