查找多个JavaScript数组之间的匹配项

查找多个JavaScript数组之间的匹配项

我有多个带有字符串值的数组,我想比较它们,只保留所有数组之间相同的匹配结果。


鉴于此示例代码:


var arr1 = ['apple', 'orange', 'banana', 'pear', 'fish', 'pancake', 'taco', 'pizza'];

var arr2 = ['taco', 'fish', 'apple', 'pizza'];

var arr3 = ['banana', 'pizza', 'fish', 'apple'];

我想生成以下包含所有给定数组的匹配的数组:


['apple', 'fish', 'pizza']

我知道我可以组合所有数组,var newArr = arr1.concat(arr2, arr3);但只是给我一个包含所有数据的数组,以及重复数据。这可以轻松完成,而不需要像underscore.js这样的库的开销吗?


(太好了,现在我也饿了!)


编辑我想我应该提到可能有一个未知数量的数组,我只是以3为例。


翻过高山走不出你
浏览 985回答 3
3回答

翻翻过去那场雪

现在,您已经在问题中添加了不确定数量的数组,这是另一种方法,它将每个项目的计数收集到一个对象中,然后整理具有最大计数的项目。这种方法的优点:如果数组较大,那么强力搜索选项(由其他答案使用)的速度要快15倍不需要ES5或ES5垫片(适用于所有浏览器)完全非破坏性(根本不改变源数据)处理源数组中的重复项处理任意数量的输入数组这是代码:function&nbsp;containsAll(/*&nbsp;pass&nbsp;all&nbsp;arrays&nbsp;here&nbsp;*/)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;output&nbsp;=&nbsp;[]; &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;cntObj&nbsp;=&nbsp;{}; &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;array,&nbsp;item,&nbsp;cnt; &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;for&nbsp;each&nbsp;array&nbsp;passed&nbsp;as&nbsp;an&nbsp;argument&nbsp;to&nbsp;the&nbsp;function &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(var&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;arguments.length;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array&nbsp;=&nbsp;arguments[i]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;for&nbsp;each&nbsp;element&nbsp;in&nbsp;the&nbsp;array &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(var&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;<&nbsp;array.length;&nbsp;j++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item&nbsp;=&nbsp;"-"&nbsp;+&nbsp;array[j]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cnt&nbsp;=&nbsp;cntObj[item]&nbsp;||&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;if&nbsp;cnt&nbsp;is&nbsp;exactly&nbsp;the&nbsp;number&nbsp;of&nbsp;previous&nbsp;arrays,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;then&nbsp;increment&nbsp;by&nbsp;one&nbsp;so&nbsp;we&nbsp;count&nbsp;only&nbsp;one&nbsp;per&nbsp;array &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(cnt&nbsp;==&nbsp;i)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cntObj[item]&nbsp;=&nbsp;cnt&nbsp;+&nbsp;1; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;now&nbsp;collect&nbsp;all&nbsp;results&nbsp;that&nbsp;are&nbsp;in&nbsp;all&nbsp;arrays &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(item&nbsp;in&nbsp;cntObj)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(cntObj.hasOwnProperty(item)&nbsp;&&&nbsp;cntObj[item]&nbsp;===&nbsp;arguments.length)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output.push(item.substring(1)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return(output);}工作演示:http://jsfiddle.net/jfriend00/52mAP/仅供参考,这不需要ES5,因此可以在没有垫片的情况下在所有浏览器中使用。在每1000个长15个阵列的性能测试中,这比我在jsperf中使用的搜索方法快了10倍以上:http://jsperf.com/in-all-arrays&nbsp;。这是一个使用ES6&nbsp;Map并Set进行重复数据删除和跟踪计数的版本。这样做的优点是数据类型可以保留并且可以是任何东西(它甚至不需要进行自然的字符串转换,数据甚至可以是对象,尽管对象是完全相同的对象,而不是相同的对象属性/值)。var&nbsp;arrays&nbsp;=&nbsp;[ &nbsp;&nbsp;&nbsp;&nbsp;['valueOf',&nbsp;'toString','apple',&nbsp;'orange',&nbsp;'banana',&nbsp;'banana',&nbsp;'pear',&nbsp;'fish',&nbsp;'pancake',&nbsp;'taco',&nbsp;'pizza',&nbsp;1,&nbsp;2,&nbsp;999,&nbsp;888], &nbsp;&nbsp;&nbsp;&nbsp;['valueOf',&nbsp;'toString','taco',&nbsp;'fish',&nbsp;'fish',&nbsp;'apple',&nbsp;'pizza',&nbsp;1,&nbsp;999,&nbsp;777,&nbsp;999,&nbsp;1], &nbsp;&nbsp;&nbsp;&nbsp;['valueOf',&nbsp;'toString','banana',&nbsp;'pizza',&nbsp;'fish',&nbsp;'apple',&nbsp;'apple',&nbsp;1,&nbsp;2,&nbsp;999,&nbsp;666,&nbsp;555] &nbsp;&nbsp;&nbsp;&nbsp;]; &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;subclass&nbsp;for&nbsp;updating&nbsp;cnts&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;MapCnt&nbsp;extends&nbsp;Map&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;constructor(iterable)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(iterable); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;cnt(iterable)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;make&nbsp;sure&nbsp;items&nbsp;from&nbsp;the&nbsp;array&nbsp;are&nbsp;unique &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;set&nbsp;=&nbsp;new&nbsp;Set(iterable); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;now&nbsp;update&nbsp;the&nbsp;cnt&nbsp;for&nbsp;each&nbsp;item&nbsp;in&nbsp;the&nbsp;set &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(let&nbsp;item&nbsp;of&nbsp;set)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;cnt&nbsp;=&nbsp;this.get(item)&nbsp;||&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++cnt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.set(item,&nbsp;cnt); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}function&nbsp;containsAll(...allArrays)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;cntObj&nbsp;=&nbsp;new&nbsp;MapCnt(); &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(array&nbsp;of&nbsp;allArrays)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cntObj.cnt(array); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;now&nbsp;see&nbsp;how&nbsp;many&nbsp;items&nbsp;have&nbsp;the&nbsp;full&nbsp;cnt &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;output&nbsp;=&nbsp;[]; &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(var&nbsp;[item,&nbsp;cnt]&nbsp;of&nbsp;cntObj.entries())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(cnt&nbsp;===&nbsp;allArrays.length)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output.push(item); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return(output);}&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;result&nbsp;=&nbsp;containsAll.apply(this,&nbsp;arrays);document.body.innerHTML&nbsp;=&nbsp;"<pre>[<br>&nbsp;&nbsp;&nbsp;&nbsp;"&nbsp;+&nbsp;result.join(',<br>&nbsp;&nbsp;&nbsp;&nbsp;')&nbsp;+&nbsp;"<br>]</pre>";

鸿蒙传说

假设有一组数组我们想要找到它们的交集,那么最简单的单线程方法就可以了var&nbsp;arr&nbsp;=&nbsp;[[0,1,2,3,4,5,6,7,8,9],[0,2,4,6,8],[4,5,6,7]], &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;=&nbsp;arr.reduce((p,c)&nbsp;=>&nbsp;p.filter(e&nbsp;=>&nbsp;c.includes(e)));document.write("<pre>"&nbsp;+&nbsp;JSON.stringify(int)&nbsp;+&nbsp;"</pre>");
打开App,查看更多内容
随时随地看视频慕课网APP