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);
}


六. 运行之后,验证


20191012133552187.png


谢谢!!!

相关文章
|
4天前
|
JavaScript 索引
Vue.js的`v-for`用于基于数组或对象渲染列表,如遍历数组生成`&lt;li&gt;`元素
【6月更文挑战第25天】Vue.js的`v-for`用于基于数组或对象渲染列表,如遍历数组生成`&lt;li&gt;`元素。基本语法是`v-for=&quot;(item, index) in items&quot;`,支持遍历对象的键值对。注意与`v-if`同用时应使用`&lt;template&gt;`,组件上使用`v-for`需设`key`属性以优化性能。
15 2
|
2天前
|
JavaScript 前端开发
技术经验分享:javaScript遍历对象、数组总结
技术经验分享:javaScript遍历对象、数组总结
技术经验分享:javaScript遍历对象、数组总结
|
3天前
|
JavaScript 索引
JS判断数组是否包含某个元素
JS判断数组是否包含某个元素
10 1
|
7天前
|
存储 JavaScript 前端开发
JavaScript中的数组是核心数据结构,用于存储和操作序列数据
【6月更文挑战第22天】JavaScript中的数组是核心数据结构,用于存储和操作序列数据。创建数组可以使用字面量`[]`或`new Array()`。访问元素通过索引,如`myArray[0]`,修改同样如此。常见方法包括:`push()`添加元素至末尾,`pop()`移除末尾元素,`shift()`移除首元素,`unshift()`添加到开头,`join()`连接为字符串,`slice()`提取子数组,`splice()`进行删除、替换,`indexOf()`查找元素位置,`sort()`排序数组。还有其他如`reverse()`、`concat()`等方法。
16 2
|
8天前
|
JavaScript 前端开发
记录Javascript数组类练习
记录Javascript数组类练习
9 1
|
11天前
|
JavaScript 前端开发 数据处理
【JavaScript】JavaScript数组全方位探索指南:深入理解数组特性
【JavaScript】JavaScript数组全方位探索指南:深入理解数组特性
12 1
|
14天前
|
JavaScript 前端开发 索引
深入了解JavaScript中的indexOf()方法:实现数组元素的搜索和索引获取
深入了解JavaScript中的indexOf()方法:实现数组元素的搜索和索引获取
|
17天前
|
JavaScript 前端开发 索引
JavaScript基础-数组操作:增删改查
【6月更文挑战第11天】本文介绍了JavaScript数组的增删改查操作,包括查询(索引访问、indexOf、lastIndexOf、includes)、修改(直接赋值、splice)、添加(push、unshift、splice)和删除(pop、shift、splice)。同时,文章列举了三个易错点:数组越界、splice参数理解不清及修改原数组与返回值混淆,并提供了相应的避免策略。通过代码示例展示了各种操作的用法,强调理解方法特性和实践的重要性,以提升数组操作效率。
|
23天前
|
JavaScript 前端开发
JavaScript删除数组中指定元素3种方法例子
JavaScript删除数组中指定元素3种方法例子