繁体   English   中英

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

[英]How to check whether multiple values exist within an Javascript array

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

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

原生 JavaScript 解决方案

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

你需要的兼容性补丁everyindexOf如果你支持旧的浏览器,包括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))
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

用于测试arr1中的所有元素是否存在于arr2中的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]));

如果您需要更多地了解数组中的哪些项目,您可以使用这个:

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)

使用数组函数: [].filter[].includes

像这样的东西:

[34, 78, 89].filter((v) => {
    return [78, 67, 34, 99, 56, 89].includes(v);
});

这将返回匹配项的数组

然后我们可以将它与needles数组进行比较

作为一个函数,它将是:

const contains = (haystack, needles) => {
    return haystack.filter((v) => {
        return needles.includes(v);
    }).length === needles.length;
}

只是为了好玩,我用 Array.prototype.reduce() 实现了一些东西:

let areKeysPresent = function (sourceArray, referenceArray) {
    return sourceArray.reduce((acc, current) => acc & referenceArray.includes(current), true)
}

你也可以像这样添加一个 containsAll 到 Array 原型:

Array.prototype.containsAll = function()
{
    return Array.from(arguments).every(i => this.includes(i));
}

例子:

["apple", "banana", "strawberry"].containsAll("apple", "banana"); // true

["apple", "banana", "strawberry"].containsAll("apple", "kiwi"); // false

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

function contains(haystack, needles) {

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

试试这个。

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 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM