JS计算两个数组的交集、差集、并集、补集(多种实现方式)

  • 方法一:最普遍的做法
    • 1、直接使用 filter、concat 来计算
    • 2、对 Array 进行扩展
  • 方法二:使用 ES6 语法实现
  • 方法三:使用 jQuery 实现
  • 运行结果

方法一:最普遍的做法

使用 ES5 语法来实现虽然会麻烦些,但兼容性最好,不用考虑浏览器 JavaScript 版本。也不用引入其他第三方库。

1、直接使用 filter、concat 来计算

var a = [1,2,3,4,5]
var b = [2,4,6,8,10]
//交集
var intersect = a.filter(function(v){ return b.indexOf(v) > -1 })
//差集
var minus = a.filter(function(v){ return b.indexOf(v) == -1 })
//补集
var complement = a.filter(function(v){ return !(b.indexOf(v) > -1) }).concat(b.filter(function(v){ return !(a.indexOf(v) > -1)}))
//并集
var unionSet = a.concat(b.filter(function(v){ return !(a.indexOf(v) > -1)}));
console.log("数组a:", a);
console.log("数组b:", b);
console.log("a与b的交集:", intersect);
console.log("a与b的差集:", minus);
console.log("a与b的补集:", complement);
console.log("a与b的并集:", unionSet);

2、对 Array 进行扩展

(1)为方便使用,我们可以对数组功能进行扩展,增加一些常用的方法。

//数组功能扩展
//数组迭代函数
Array.prototype.each = function(fn){fn = fn || Function.K;var a = [];var args = Array.prototype.slice.call(arguments, 1);for(var i = 0; i < this.length; i++){var res = fn.apply(this,[this[i],i].concat(args));if(res != null) a.push(res);}return a;
};
//数组是否包含指定元素
Array.prototype.contains = function(suArr){for(var i = 0; i < this.length; i ++){if(this[i] == suArr){return true;}}return false;
}
//不重复元素构成的数组
Array.prototype.uniquelize = function(){var ra = new Array();for(var i = 0; i < this.length; i ++){if(!ra.contains(this[i])){ra.push(this[i]);}}return ra;
};
//两个数组的交集
Array.intersect = function(a, b){return a.uniquelize().each(function(o){return b.contains(o) ? o : null});
};
//两个数组的差集
Array.minus = function(a, b){return a.uniquelize().each(function(o){return b.contains(o) ? null : o});
};
//两个数组的补集
Array.complement = function(a, b){return Array.minus(Array.union(a, b),Array.intersect(a, b));
};
//两个数组并集
Array.union = function(a, b){return a.concat(b).uniquelize();
};

(2)使用样例

var a = [1,2,3,4,5]
var b = [2,4,6,8,10]
console.log("数组a:", a);
console.log("数组b:", b);
console.log("a与b的交集:", Array.intersect(a, b));
console.log("a与b的差集:", Array.minus(a, b));
console.log("a与b的补集:", Array.complement(a, b));
console.log("a与b的并集:", Array.union(a, b));

方法二:使用 ES6 语法实现

(1)而在 ES6 中我们可以借助扩展运算符(…)以及 Set 的特性实现相关计算,代码也会更加简单些。

var a = [1,2,3,4,5]
var b = [2,4,6,8,10]
console.log("数组a:", a);
console.log("数组b:", b);
var sa = new Set(a);
var sb = new Set(b);
// 交集
let intersect = a.filter(x => sb.has(x));
// 差集
let minus = a.filter(x => !sb.has(x));
// 补集
let complement = [...a.filter(x => !sb.has(x)), ...b.filter(x => !sa.has(x))];
// 并集
let unionSet = Array.from(new Set([...a, ...b]));
console.log("a与b的交集:", intersect);
console.log("a与b的差集:", minus);
console.log("a与b的补集:", complement);
console.log("a与b的并集:", unionSet);

(2)借助includes以及箭头函数,代码也会更加简单些。

var a = [1,2,3,4,5];
var b = [2,4,6,8,10];
//交集
var intersect = a.filter(v => b.includes(v));
//差集
var minus = a.filter(v => !b.includes(v));
//补集
var complement = a.filter(v => !b.includes(v)).concat(b.filter(v => !a.includes(v)))
//并集
var unionSet = a.concat(b.filter(v => !a.includes(v)));
console.log("a与b的交集:", intersect);
console.log("a与b的差集:", minus);
console.log("a与b的补集:", complement);
console.log("a与b的并集:", unionSet);

方法三:使用 jQuery 实现

引入 jQuery,那么实现起来也很简单。

var a = [1,2,3,4,5]
var b = [2,4,6,8,10]
console.log("数组a:", a);
console.log("数组b:", b);
// 交集
let intersect = $(a).filter(b).toArray();
// 差集
let minus = $(a).not(b).toArray();
// 补集
let complement = $(a).not(b).toArray().concat($(b).not(a).toArray());
// 并集
let unionSet = $.unique(a.concat(b));
console.log("a与b的交集:", intersect);
console.log("a与b的差集:", minus);
console.log("a与b的补集:", complement);
console.log("a与b的并集:", unionSet);

运行结果

JS计算两个数组的交集、差集、并集、补集(多种实现方式)相关推荐

  1. java计算两个数组的交集_回顾面试题:计算两个数组交集

    背景 工作多年,语言经历过C#,JAVA.但是做过的项目大多以业务系统为主,曾经做过一些基础架构的工作,但算法一直在工作中应用的比较少,导致多年之后基本都忘记完了.上一次面试过程中就有一个算法题,我能 ...

  2. 求两个数组的交集和并集

    晚上闲来无事,想起前两天查资料时候,看到别人一篇博客标题关于数组的交集和并集,晚上也随便写写,权当督促自己坚持经常练习练习写写小Demo.如下,先来一段求有序数组的交集的代码,代码如下: public ...

  3. 【mysql】mysql获取两个集合的交集/差集/并集

    mysql的常见场景,获取两个数据集的交集和差集 步骤 两个集合的结构要一致,对应的字段数,字段类型 将两个集合用 UNION ALL 关键字合并,这里的结果是有重复的所有集 将上面的所有集 GROU ...

  4. javascript 数组求交集/差集/并集/过滤重复

    最近在小一个小程序项目,突然发现 javscript 对数组支持不是很好,连这些基本的功能,都还要自己封装.网上查了下,再结合自己的想法,封装了一下,代码如下. //数组交集 Array.protot ...

  5. 两个数组的交集和并集

    let arr1 = [1, 2, 3, 4, 5, 5] let arr2 = [4, 5, 5, 6]// 交集 let res1 = Array.from(new Set(arr1.filter ...

  6. 数组-两个数组的交集(两个集合)

    题意: 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2] 示例 2: 输入:nums1 = [4,9,5] ...

  7. 350. Intersection of Two Arrays II 两个数组的交集 II

    Title 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: nums1 = ...

  8. java合并两个数组_「JAVA」两个数组的交集—力扣每日一题(一)

    示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4] ...

  9. LintCode 两个数组的交集

    547.两数组的交集 描述 给出两个数组,写出一个方法求出它们的交集 样例 例1: 输入: nums1 = [1, 2, 2, 1], nums2 = [2, 2], 输出: [2]. 例2: 输入: ...

  10. Java求两个数组的交集、差集、并集

    目录 Java求两个数组的并集,代码如下: Java求两个数组的交集,代码如下: Java求两个数组的差集,代码如下: 交集.差集.并集测试代码如下: Java求两个数组的并集,代码如下: /*** ...

最新文章

  1. 新型智能电视攻击,9成国外设备或受影响
  2. WEBAPP开发技巧
  3. CFtpFileFind FindFile卡住的问题
  4. 教资科目一要背的内容 0303
  5. 空间滤波_第三章 灰度变换与空间滤波-(六)锐化空间滤波器之拉普拉斯算子...
  6. Scala零基础教学【61-80】
  7. 树莓派 4 与英伟达 Jetson Nano 性能大比拼,谁是最佳的嵌入式“电脑”?
  8. python学习(1)启程
  9. 深入理解计算机系统(2.4)---C语言的有符号与无符号、二进制整数的扩展与截断...
  10. Tsung压力测试工具的搭建和使用,配置。
  11. asp.net 从客户端中检测到有潜在危险的Request.Form值
  12. discuzX 数据库操作类
  13. 标题采集软件-免费标题生成器
  14. Python教学视频(三)数据类型及类型间的转换
  15. Day771.Redis好用的运维工具 -Redis 核心技术与实战
  16. 企业“招投标”一般需要办理哪些体系认证?
  17. 使用CacheFS+TmpFS加速NFS读取速度
  18. 读书笔记_《统计陷阱》达莱尔.哈夫
  19. VMware环境部署vFW虚拟防火墙
  20. 敖丙大神的非科班Java学习路线

热门文章

  1. python去除视频水印接口_使用ffmpeg去除视频水印【ffmpeg】
  2. 适合新手的python练习(9)
  3. 使用Photoshop制作证件照
  4. 浅谈 | 日内动量交易策略
  5. 手机自动休眠与距离感应器失效的问题
  6. oracle redo查询,ORACLE UNDO REDO查看
  7. 博主自传——蒟蒻的OI之路
  8. 游戏后端自增id选型
  9. protobuf 3 的简单使用
  10. WAV音乐文件无法修改标题