如何检查Javascript数组中是否存在多个值

所以,我正在使用Jquery,并且有两个数组都有多个值,我想检查第一个数组中的所有值是否存在于第二个数组中。

例如,示例1 ……

数组A包含以下值

34,78,89

数组B包含以下值

78,67,34,99,56,89

这将返回真实

……例2:

数组A包含以下值

34,78,89

数组B包含以下值

78,67,99,56,89

这将返回false

……例3:

数组A包含以下值

34,78,89

数组B包含以下值

78,89

这将返回false

到目前为止,我试图解决这个问题:

  1. 使用自定义’compare’方法扩展Jquery以比较两个数组。 问题是当数组相同时这只返回true ,你可以从例1看到我希望它返回true,即使它们不相同但至少包含值
  2. 使用Jquerys .inArray函数 ,但这只检查数组中的一个值,而不是多个。

任何人都可以投入任何光线都会很棒。

function containsAll(needles, haystack){ for(var i = 0 , len = needles.length; i < len; i++){ if($.inArray(needles[i], haystack) == -1) return false; } return true; } containsAll([34, 78, 89], [78, 67, 34, 99, 56, 89]); // true containsAll([34, 78, 89], [78, 67, 99, 56, 89]); // false containsAll([34, 78, 89], [78, 89]); // false 

原生JavaScript解决方案

 var success = array_a.every(function(val) { return array_b.indexOf(val) !== -1; }); 

如果您支持旧版浏览器(包括IE8),则需要为everyindexOf兼容性补丁。

  • 来自MDN的.every() 兼容性补丁 。
  • 来自MDN的兼容性补丁 ,用于.indexOf()

完整的jQuery解决方案

 var success = $.grep(array_a, function(v,i) { return $.inArray(v, array_b) !== -1; }).length === array_a.length; 

使用带有$.inArray


ES2015解决方案

可以使用ES2015的箭头函数语法及其.includes()方法缩短上面的本机解决方案:

 let success = array_a.every((val) => array_b.includes(val)) 

我注意到问题是关于使用jQuery解决这个问题,但是如果其他任何不限于jQuery的人出现,那么使用下划线js就有一个简单的解决方案。

使用下划线js,您可以:

 _.intersection(ArrayA, ArrayB).length === ArrayA.length; 

来自文档:

intersection_.intersection(* arrays)计算所有数组交集的值列表。 结果中的每个值都存在于每个数组中。

_.intersection([1,2,3],[101,2,1,10],[2,1]); => [1,2]

因此,如果ArrayA中缺少ArrayA中的某个项目,那么交集将比ArrayA短。

一个单行测试arr2中存在arr1中的所有元素…

使用es6:

 var containsAll = arr1.every(i => arr2.includes(i)); 

没有es6:

 var containsAll = arr1.every(function (i) { return arr2.includes(i); }); 

试试这个。

 var arr1 = [34, 78, 89]; var arr2 = [78, 67, 34, 99, 56, 89]; var containsVal = true; $.each(arr1, function(i, val){ if(!$.inArray(val, arr2) != -1){ retVal = false; return false; } }); if(containsVal){ //arr2 contains all the values from arr1 } 

您可以使用这个简单的函数(根据上面的答案重命名变量以便于阅读):

 function contains(haystack, needles) { return needles.map(function (needle) { return haystack.indexOf(needle); }).indexOf(-1) == -1; } 

如果您需要更多关于arrays中哪些项目的可见性,您可以使用以下项目:

 var tools = { elem : {}, arrayContains : function(needles, arrhaystack) { if (this.typeOf(needles) === 'array') { needle.reduce(function(result,item,$i,array){ // You can use any other way right there. var present = (arrhaystack.indexOf(item) > -1); Object.defineProperty(tools.elem, item, { value : present, writable : true }); },{}) return this.elem; } }, typeOf : function(obj) { return {}.toString.call(obj).split(' ')[1].slice(0, -1).toLowerCase(); } } 

使用简单的var check = tools.arrayContains([10,'foo'], [1,'foo','bar'])

然后你得到的结果就像

 10 : false foo : true 

然后,如果您只需要获得一个结果,如果其中一个是真的,您可以:

 arr = Object.values(check); (arr.indexOf('true')) ? instru1 : instru2 ; 

我不认为这是更好的方式,但它的工作和容易适应。 考虑到这个例子,我建议你在使用它之前制作一个Object.create(tools)