利用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452160.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RT-Thread简介

RT-Thread简介 RT-Thread是一款完全由国内团队开发维护的嵌入式实时操作系统&#xff08;RTOS&#xff09;&#xff0c;具有完全的自主知识产权。 经过16个年头的沉淀&#xff0c;伴随着物联网的兴起&#xff0c;它正演变成一个功能强大、组件丰富的物联网操作系统。 RT-Thre…

调用第三方API ,实现手机号码归属地及运营商查询

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 运行结果&#xff1a; 中国电信 西双版纳 西双版纳,中国电信 代码&#xff1a; import java.io.BufferedReader; import java.io.I…

学成在线--21.课程信息修改

文章目录一.需求分析二.课程管理导航页面1.定义course_manage.vue为课程管理页面2.创建各个信息管理页面3.创建路由三.服务端1.Api接口1&#xff09;根据课程ID查询课程信息2&#xff09;修改课程信息2.Dao3.Service4.Controller四.前端1. 完成course_baseinfo.vue页面2.API方法…

HTTP协议特点

&#xff08;一&#xff09;HTTP协议是无状态的。也就是说&#xff0c;同一个客户第二次访问同一个服务器上的页面时&#xff0c;服务器的响应与第一次被访问时相同。服务器不记得访问过得这个用户&#xff0c;也不记得为这个客户服务过多少次。 &#xff08;二&#xff09;HT…

C#曲线分析平台的制作(四,highcharts+ajax加载后台数据)

在上一篇博客&#xff1a;C#曲线分析平台的制作&#xff08;三&#xff0c;三层构架echarts显示&#xff09;中已经完成了后台的三层构架的简单搭建&#xff0c;为实现后面的拓展应用开发和review 改写提供了方便。而在曲线分析平台中&#xff0c;往往有要求时间轴联动功能&…

国际C语言混乱代码大赛结果公布

国际C语言混乱代码大赛&#xff08;IOCCC, The International Obfuscated C Code Contest&#xff09;是一项国际编程赛事&#xff0c;从1984年开始&#xff0c;每年举办一次&#xff08;1997年、1999年、2002年、2003年和2006年例外&#xff09;。目的是写出最有创意的最让人难…

JDBC连接数据库(一)

原文地址http://www.cnblogs.com/hongten/archive/2011/03/29/1998311.html JDBC连接数据库 创建一个以JDBC连接数据库的程序&#xff0c;包含7个步骤&#xff1a; 1、加载JDBC驱动程序&#xff1a; 在连接数据库之前&#xff0c;首先要加载想要连接的数据库的驱动到JVM…

eclipse加速之禁用 JS、jsp 等文件的语法验证

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 去除eclipse的JS验证&#xff1a; 将windows->preference->Java Script->Validator->Errors/Warnings-> Enable Javascr…

学成在线--22.课程营销

文章目录一.需求分析二.数据模型三.服务端1.Api接口1&#xff09;查询课程营销信息2&#xff09;更新课程营销信息2.Dao3.Service4.Controller四.前端1.Api 方法2.编写 course_marketinfo.vue1&#xff09;template2&#xff09;数据对象3&#xff09;保存方法4&#xff09;在m…

电子邮件系统

&#xff08;一&#xff09;电子邮件系统的构成 1.用户代理 用户与电子邮件系统的接口&#xff0c;用户代理使用户能够通过一个很友好的接口来发送和接收邮件&#xff0c;用户代理就是一个运行在PC上的程序。 2 邮件服务器 邮件服务器的功能是发送和接收邮件&#xff0c;同…

面向对象的接口类 以及鸭子类型

1.接口类,抽象类. 2.鸭子类型(Python多态)(Python三大特性之一)Python封装 1.接口类和抽象类只是在工作中书写的一种规范. class QQ: def pay(self,money): print("使用QQ支付%s"%money) class Ali: def pay(self,money): print("使用支付宝支付%s"%money…

mysql查看binlog日志内容

2019独角兽企业重金招聘Python工程师标准>>> &#xff08;一&#xff09; binlog介绍 binlog,即二进制日志,它记录了数据库上的所有改变&#xff0c;并以二进制的形式保存在磁盘中&#xff1b; 它可以用来查看数据库的变更历史、数据库增量备份和恢复、Mysql的复制&…

架构师:我们需要顶层设计

架构师&#xff1a;我们需要顶层设计背景&#xff1a; 某公司&#xff0c;建立的程序又被推倒&#xff0c;外人觉得很奇怪&#xff0c;这个程序的主管非常敬业&#xff0c;关注到了程序每一个细节&#xff0c;甚至包括每一个按钮的文字和位置。这个主管很委屈&#xff0c;他说…

文件传输协议FTP

文件传输协议FTP提供交互式的访问&#xff0c;允许客户指明文件的类型和格式&#xff0c;并允许文件具有存取权限。它屏蔽了个计算机系统的细节&#xff0c;因而适合于在异构网络中任意计算机之间传输文件。它提供不同种类主机系统之间的文件传输能力&#xff0c;可以提供用户对…

Centos7安装Docker教程

1.首先安装必要依赖&#xff1a; sudo yum install -y yum-utils device-mapper-persistent-data lvm22.然后添加仓库源&#xff1a; sudo sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo3.最后安装 Docker&#xff…

String.format() 方法用法解说

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 String chargeFlowUrl _AGENT_URL "?agentAccount" _AGENT_ACCOUNT "&sequence%s &phone%s &iceUrl%s &…

Choose unique values for the 'webAppRootKey' context-param in your web.xml files! 错误的解决

大意是Log4jConfigListener在获取webapp.root值时&#xff0c;被后一context的值替换掉了&#xff0c;所以要在各个项目的web.xml中配置不同的webAppRootKey值&#xff0c;随即在其中一个web.xml中添加&#xff1a; <context-param> <param-name>webAppRootKey<…

ionic3 cordova ionic-native插件

ionic-native插件 cordova安装插件 以及 ionic-native插件使用过程以及步骤 cordova plugin add cordova-plugin-插件名称。 //安装插件npm install ionic-native/对应插件名称 --save。 //写入package.json在app.module.ts 的 providers 进行引用解释&#xff1a;cordove plug…

Diango博客--19.使用 Docker部署项目到线上服务器

文章目录1.克隆代码到服务器2.创建环境变量文件用于存放项目敏感信息3.在 .production 文件写入下面的内容并保存4.修改 Nginx 配置5.修改项目配置文件6.启动容器7.检查容器启动状况8.配置 HTTPS 证书&#xff08;没有配置域名无法配置&#xff0c;只能通过服务器 ip 以 HTTP 协…

从一生的角度看程序员的学习和发展

很多人谈学习和发展的时候&#xff0c;往往忽略人的先天自然条件&#xff0c;在这里我们从这个视角切入&#xff0c;来探讨一下程序员一生的可能轨迹。 如果把程序员的人生分为三个阶段&#xff0c;那么他们是&#xff1a; 毕业~30岁&#xff1a;这个时间段里&#xff0c;大多…