利用Underscore求数组的交集、并集和差集
1 数组交集函数——intersection
数组的交集是指包含多个数组中的共同元素的一个数组,求数组的交集就是找出给定数组中的共有元素。
下面实现一个求两个数组交集的函数。
判断数组是够包含指定值,使用Array.indexOf就可以。所以我们可以遍历第一个参数数组,然后使用Array.indexOf方法检索第二个参数数组,如果第二个参数数组包含当前项,那么当前项即为两个数组的交集元素,放入结果数组即可:
var intersection = function(arr1, arr2) {var length = arr1.length;var result = [];var i;for(i = 0; i < length; i++) {if(result.indexOf(arr1[i]) >= 0) continue;else {if(arr2.indexOf(arr1[i]) >= 0)result.push(arr1[i]);}}return result;
}
复制代码
以上代码实现了求两个数组交集的功能。
如果涉及到多个数组呢?那就是Underscore的实现方法了。
以下是Underscore的源码(附注释):
// Produce an array that contains every item shared between all the
// passed-in arrays.
//获取传入的多个数组的交集,之所以只有一个形参,是因为该函数使用第一个数组参数作为基准。
_.intersection = function (array) {//将要返回的结果数组。var result = [];//传入数组的个数。var argsLength = arguments.length;//遍历第一个数组参数。for (var i = 0, length = getLength(array); i < length; i++) {//当前项。var item = array[i];//如果结果数组中已有该项,那么直接跳过当前循环,进入下一轮循环中。if (_.contains(result, item)) continue;var j;//从第二个参数开始,遍历每一个参数。for (j = 1; j < argsLength; j++) {//一旦有一个参数数组不包含item,就退出循环。if (!_.contains(arguments[j], item)) break;}//如果所有参数数组都包含item项,就把item放入result。if (j === argsLength) result.push(item);}return result;
};
复制代码
可以看到该函数一次接受多个数组,但是只有一个形参(array),该参数表示接收到的第一个数组,Underscore使用它作为参考,遍历该数组,然后依次判断剩余参数数组是否包含当前项,如果全部包含则该项为交集元素,推入结果数组当中。
2 数组并集函数——union
数组的并集是指包含指定的多个数组的所有元素的数组,求多个数组的并集即为求一个包含所有数组的所有元素的数组。
这里最直接的实现方法就是遍历所有数组参数,然后针对数组的每一项,放入到结果数组中(如果已经存在于结果数组中那么久不再添加)。
var union = function() {var arrays = arguments;var length = arguments.length;var result = [];var i;for(i = 0; i < length; i++) {var arr = arrays[i];var arrLength = arrays[i].length;for(var j = 0; j < arrLength; j++) {if(result.indexOf(arr[j]) < 0) {result.push(arr[j]);}}}return result;
}
复制代码
在阅读Underscore源码的时候,感觉它的实现方法十分巧妙。
Underscore中已经有了很多工具方法,所以可以拿来直接使用,比如restArgs、flatten、uniq。为什么强调这几个方法呢?因为使用这几个方法就可以实现数组求并集。
我们的union方法是接受多个数组作为参数的,而restArgs可以把多个数组参数合并到一个数组中作为参数;然后通过flatten函数,我们可以把得到的这个数组参数展开,展开之后得到的数组就是包含所有数组参数的所有元素的一个数组了,但是这个数组中有冗余项,我们必须对其进行去重;这时候使用我们的uniq工具函数就可以对其进行去重了。
经过这三个函数的处理,我们得到的数组就是多个数组参数的并集!
Underscore源码:
// Produce an array that contains the union: each distinct element from all of
// the passed-in arrays.
_.union = restArgs(function (arrays) {return _.uniq(flatten(arrays, true, true));
});
复制代码
这样的实现是不是很简介大气?
3 数组差集函数——difference
数组的差集是指由数组A中所有不属于数组B的元素所组成的一个数组。
直接的实现方法就是遍历前者,然后判断每个元素是否属于后者,如果不属于,那么就推入结果数组。
简单实现:
var difference = function(arr1, arr2) {var length = arr1.length;var i;var result = [];for(i = 0; i < length; i++) {if(arr2.indexOf(arr1[i]) < 0) {result.push(arr1[i]);}}return result;
}
复制代码
Underscore的实现(附注释):
// Take the difference between one array and a number of other arrays.
// Only the elements present in just the first array will remain.
//数组求差集函数。
//通过restArgs函数把第二个数组开始的所有参数数组合并到一个数组。
_.difference = restArgs(function (array, rest) {//使用flatten展开rest数组。rest = flatten(rest, true, true);//使用filter函数过滤array数组达到求差集的目的,判断条件就是value是否属于rest。return _.filter(array, function (value) {return !_.contains(rest, value);});
});
复制代码
更多Underscore源码解析:GitHub
利用Underscore求数组的交集、并集和差集相关推荐
- 利用函数求数组中的最大值
利用函数求数组中的最大值 <!DOCTYPE html> <html lang="en"><head><meta charset=&quo ...
- php多维数组交集,求数组差/交集函数-php数组函数(二)
求数组差集函数 函数只检查了多维数组中的一维.可以用 array_diff($array1[0], $array2[0]) 检查更深的维度. u:自定义函数比较,a(association):同时比较 ...
- linux求数组的交集,shell/bash 交集、并集、差集
方法一(直接用文件名):取两个文本文件的并集.交集.差集 并: sort -m 交: sort -m 差 file1 - file2: sort -m 方法二(用变量参数):取两个文本文件的并集.交集 ...
- 利用指针求数组的最大值和最小值
#include<stdio.h> int main() {int arr[10] = { 16,96,26,66,46,56,36,76,86,6 };int* p;int max=0, ...
- java 8 stream流求交集并集和差集
集合: 交集 :set1.retainAll(set2); 并集:set1.addAll(set2); 差集:set1.removeAll(set2); list 交集:list1.retainAll ...
- javascript 算法相关,如何利用指针特性求数组并集与交集
如何利用指针特性求数组并集与交集 javascript计算数组交集,并集,网上有很多,有些书也有介绍, 很多都是写一个set类,再添加一些方法,本质上都是利用了多次循环 我在写这个的时候,也是被别人问 ...
- Java实验——定义一个类,该类中包含以下几个方法(静态):实现两个字符串数组的逆序排序,输出结果为字符串数组;求两个整形数组的交集;求两个浮点型数组的并集;
目录 一.实现两个字符串数组的逆序排序,输出结果为字符串数组 解题思路: 具体代码: 运行截图: 二.求两个整形数组的交集 具体代码: 运行截图: 三.求两个浮点型数组的并集 解题思路: 具体代码: ...
- 求两个集合的差集代码_求求你了,不要再写循环求两个列表的交集,并集和差集了 | pythonic 小技巧...
在 Python 中,求两个列表的交集,并集和差集是经常会遇到的需求,而且也比较简单. 最容易想到的就是写循环,对两个列表分别进行循环,然后判断元素是否在另一个列表中,求得最终结果. 但这种方法比较 ...
- php求数组交集的自定义函数,php数组交集函数
在数学中的交集运算,大家在学习的时候还是比较轻松的.我们在php数组里,可以借助array_intersect()函数对两个数组求交集,最后得到一个想要的交集数据.在正式开始array_interse ...
最新文章
- java ftp connect_java实现ftp的几种方式(第3方包)
- c# for提升效率的写法
- TP框架笔记 -- 394-model的创建
- java8新特性简述
- 【数据结构】——堆排序
- 第八期:继美商务部拉黑多家中国公司后,MIT开始审查对华AI合作项目
- 打车业务下单高并发解决方案
- soapUI-JDBC Request
- 内存位置访问无效 midas.dll_java并发之内存模型
- phpize的作用(资料整理)
- 架构之重构的12条军规(上)
- 千脑智能理论:开启创造机器智能的路线图 | 《千脑智能》
- C语言取反(~)简单理解
- java判断今天是否是节假日_java 判断日期是否是节假日
- 设计师胡晓丹的创作历程
- 微软ime日文输入法在假名输入模式下怎么快速输入英文
- 计算机编程语言排行榜—TIOBE世界编程语言排行榜(2021年11月份最新版)
- OSChina 周一乱弹 ——听过煲仔饭吗?老婆饼呢?
- x265-1.8版本-common/wavefront.cpp注释
- 安卓开发中的一些经验总结
热门文章
- 复化科特斯公式matlab_matlab实现复化NewtonCotes公式求积分的程序应用和代码
- 三个球A,B,C大小形状相同,且其中有一个球与其他球的重量不同,要求找出这个不一样的球
- php类如何变为静态调用,PHP类中静态方法如何调用非静态方法?_后端开发
- 微型计算机中celeron,微型计算机中常提及的Pentium或Celeron是指其_______
- C# 字符串逗号分隔存到List 数组(互相转换)
- e4a服务器文件,e4a链接网站服务器
- 剑指offer:55-58记录
- 计算机分php,计算机按照处理数据的形态分类,可以分为什么?
- 王道考研 计算机网络7 TCP/IP参考模型
- 人民币贬值会让八类人损失惨重!有你吗?