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


谢谢!!!

相关文章
|
JavaScript 前端开发
JS浮点数精度问题及高精度小数运算:BigNumber解决方案
JS浮点数精度问题及高精度小数运算:BigNumber解决方案
1810 0
|
6月前
|
JavaScript 前端开发
js小数运算出现的问题(精度丢失)及解决办法-亲测有效
JavaScript浮点数运算存在精度丢失问题,如0.1+0.2不等于0.3。原因是十进制小数转二进制时可能出现无限循环,导致舍入误差。本文提供一种精度处理方法,通过将小数转为整数运算后再还原,实现加减乘除的精确计算,解决常见浮点运算误差问题。
1024 0
|
12月前
|
JavaScript 前端开发 API
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
12月前
|
数据采集 JavaScript 前端开发
JavaScript中通过array.filter()实现数组的数据筛选、数据清洗和链式调用,JS中数组过滤器的使用详解(附实际应用代码)
用array.filter()来实现数据筛选、数据清洗和链式调用,相对于for循环更加清晰,语义化强,能显著提升代码的可读性和可维护性。博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
自然语言处理 前端开发 JavaScript
🛠️ JavaScript数组操作指南:20个精通必备技巧🚀
本文详细介绍了 JavaScript 中的 20 个高效数组操作技巧,涵盖了从基本的添加、移除元素,到数组转换和去重等高级操作。强调了不可变性的重要性,提供了清晰的代码示例,帮助开发者编写更整洁和高效的代码。无论是新手还是经验丰富的开发者,这些技巧都将显著提升您的编码能力,使您在项目中更具竞争力。
300 2
|
JavaScript 前端开发 Java
【javaScript数组,函数】的基础知识点
【javaScript数组,函数】的基础知识点
148 5
|
JavaScript
js删除数组中已知下标的元素
js删除数组中已知下标的元素
470 4
|
JavaScript 前端开发 测试技术
JS都有哪些操作数组的方法
JS都有哪些操作数组的方法
497 3
|
缓存 JavaScript 前端开发
JavaScript中数组、对象等循环遍历的常用方法介绍(二)
JavaScript中数组、对象等循环遍历的常用方法介绍(二)
232 1
|
JavaScript 前端开发 索引
探索JavaScript数组:基础
探索JavaScript数组:基础
114 3