JS计算两个数组的交集、差集、并集、补集(多种实现方式)
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计算两个数组的交集、差集、并集、补集(多种实现方式)相关推荐
- java计算两个数组的交集_回顾面试题:计算两个数组交集
背景 工作多年,语言经历过C#,JAVA.但是做过的项目大多以业务系统为主,曾经做过一些基础架构的工作,但算法一直在工作中应用的比较少,导致多年之后基本都忘记完了.上一次面试过程中就有一个算法题,我能 ...
- 求两个数组的交集和并集
晚上闲来无事,想起前两天查资料时候,看到别人一篇博客标题关于数组的交集和并集,晚上也随便写写,权当督促自己坚持经常练习练习写写小Demo.如下,先来一段求有序数组的交集的代码,代码如下: public ...
- 【mysql】mysql获取两个集合的交集/差集/并集
mysql的常见场景,获取两个数据集的交集和差集 步骤 两个集合的结构要一致,对应的字段数,字段类型 将两个集合用 UNION ALL 关键字合并,这里的结果是有重复的所有集 将上面的所有集 GROU ...
- javascript 数组求交集/差集/并集/过滤重复
最近在小一个小程序项目,突然发现 javscript 对数组支持不是很好,连这些基本的功能,都还要自己封装.网上查了下,再结合自己的想法,封装了一下,代码如下. //数组交集 Array.protot ...
- 两个数组的交集和并集
let arr1 = [1, 2, 3, 4, 5, 5] let arr2 = [4, 5, 5, 6]// 交集 let res1 = Array.from(new Set(arr1.filter ...
- 数组-两个数组的交集(两个集合)
题意: 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2] 示例 2: 输入:nums1 = [4,9,5] ...
- 350. Intersection of Two Arrays II 两个数组的交集 II
Title 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: nums1 = ...
- java合并两个数组_「JAVA」两个数组的交集—力扣每日一题(一)
示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4] ...
- LintCode 两个数组的交集
547.两数组的交集 描述 给出两个数组,写出一个方法求出它们的交集 样例 例1: 输入: nums1 = [1, 2, 2, 1], nums2 = [2, 2], 输出: [2]. 例2: 输入: ...
- Java求两个数组的交集、差集、并集
目录 Java求两个数组的并集,代码如下: Java求两个数组的交集,代码如下: Java求两个数组的差集,代码如下: 交集.差集.并集测试代码如下: Java求两个数组的并集,代码如下: /*** ...
最新文章
- 新型智能电视攻击,9成国外设备或受影响
- WEBAPP开发技巧
- CFtpFileFind FindFile卡住的问题
- 教资科目一要背的内容 0303
- 空间滤波_第三章 灰度变换与空间滤波-(六)锐化空间滤波器之拉普拉斯算子...
- Scala零基础教学【61-80】
- 树莓派 4 与英伟达 Jetson Nano 性能大比拼,谁是最佳的嵌入式“电脑”?
- python学习(1)启程
- 深入理解计算机系统(2.4)---C语言的有符号与无符号、二进制整数的扩展与截断...
- Tsung压力测试工具的搭建和使用,配置。
- asp.net 从客户端中检测到有潜在危险的Request.Form值
- discuzX 数据库操作类
- 标题采集软件-免费标题生成器
- Python教学视频(三)数据类型及类型间的转换
- Day771.Redis好用的运维工具 -Redis 核心技术与实战
- 企业“招投标”一般需要办理哪些体系认证?
- 使用CacheFS+TmpFS加速NFS读取速度
- 读书笔记_《统计陷阱》达莱尔.哈夫
- VMware环境部署vFW虚拟防火墙
- 敖丙大神的非科班Java学习路线