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

Bet*_*min 37 javascript arrays jquery

所以,我正在使用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函数,但这只检查数组中的一个值,而不是多个.

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

小智 73

原生JavaScript解决方案

var success = array_a.every(function(val) {
    return array_b.indexOf(val) !== -1;
});
Run Code Online (Sandbox Code Playgroud)

您需要兼容性补丁every,indexOf如果您支持旧版浏览器,包括IE8.


完整的jQuery解决方案

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

使用$.grep$.inArray.


ES2015解决方案

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

let success = array_a.every((val) => array_b.includes(val))
Run Code Online (Sandbox Code Playgroud)


ggr*_*ner 51

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
Run Code Online (Sandbox Code Playgroud)

  • 本机解决方案要好得多 (6认同)

pul*_*0ne 26

一个单行测试所有元素arr1存在于arr2......

使用es6:

var containsAll = arr1.every(i => arr2.includes(i));
Run Code Online (Sandbox Code Playgroud)

没有es6:

var containsAll = arr1.every(function (i) { return arr2.includes(i); });
Run Code Online (Sandbox Code Playgroud)


dat*_*arl 14

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

使用下划线js你可以做:

_.intersection(ArrayA, ArrayB).length === ArrayA.length;
Run Code Online (Sandbox Code Playgroud)

来自文档:

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

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

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


Nin*_*olz 5

您可以拿一个Set并再次检查所有项目。

const
    containsAll = (needles, haystack) =>
        needles.every(Set.prototype.has, new Set(haystack));

console.log(containsAll([105, 112, 103], [106, 105, 103, 112]));
Run Code Online (Sandbox Code Playgroud)