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

IT技术 javascript jquery arrays
2021-03-11 10:59:49

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

例如,示例 1...

数组 A 包含以下值

34, 78, 89

数组 B 包含以下值

78, 67, 34, 99, 56, 89

这将返回true

...示例 2:

数组 A 包含以下值

34, 78, 89

数组 B 包含以下值

78, 67, 99, 56, 89

这将返回false

...示例 3:

数组 A 包含以下值

34, 78, 89

数组 B 包含以下值

78, 89

这将返回false

到目前为止,我已尝试通过以下方式解决此问题:

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

任何人都可以抛出的任何灯都会很棒。

6个回答

原生 JavaScript 解决方案

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

你需要的兼容性补丁every以及indexOf如果需要支持旧的浏览器,包括IE8。


完整的jQuery解决方案

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

用途$.grep使用$.inArray


ES2015 解决方案

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

let success = array_a.every((val) => array_b.includes(val))
i (index) 变量未使用且不需要(至少对于 JS 解决方案)
2021-04-21 10:59:49
太棒了,ES6 解决方案 +1
2021-04-22 10:59:49
@jpoppe:是的,可以省略该参数。我的答案是社区维基,所以只要尊重原始意图,就可以随意进行改进和补充。
2021-05-05 10:59:49
function containsAll(needles, haystack){ 
  for(var i = 0; i < needles.length; 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
本机解决方案要好得多
2021-04-24 10:59:49

一种单线测试,用于测试中的所有元素是否arr1存在于arr2...

使用es6:

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

没有 es6:

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

我注意到这个问题是关于用 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 中的一项在 ArrayB 中丢失,则交集将比 ArrayA 短。

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

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

console.log(containsAll([105, 112, 103], [106, 105, 103, 112]));