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

时间:2012-02-09 01:37:53

标签: javascript jquery arrays

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

例如,示例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 with a custom 'compare' method以比较两个数组。问题是,当数组相同时,这只返回 true ,并且从示例1中可以看出,即使它们不相同但至少包含值
  2. ,我希望它返回true
  3. 使用Jquerys .inArray function,但这只检查数组中的一个值,而不是多个。
  4. 任何人都可以投入任何光线都会很棒。

10 个答案:

答案 0 :(得分:60)

原生JavaScript解决方案

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

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


完整的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))

答案 1 :(得分:48)

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

答案 2 :(得分:14)

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

使用下划线js你可以这样做:

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

来自文档:

  

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

     

_。交叉口([1,2,3],[101,2,1,10],[2,1]);   =&GT; [1,2]

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

答案 3 :(得分:12)

用于测试arr1arr2中所有元素的单行内容...

使用es6:

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

没有es6:

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

答案 4 :(得分:0)

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

function contains(haystack, needles) {

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

答案 5 :(得分:0)

试试这个。

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 
}

答案 6 :(得分:0)

如果您需要更多了解阵列中哪些项目,可以使用以下方法:

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),然后再使用它。

答案 7 :(得分:0)

您可以使用Set并再次检查所有项目。

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

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

答案 8 :(得分:0)

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

类似这样的东西:

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

这将返回匹配项的数组

然后我们可以将其与针阵列进行比较

根据功能,它将是:

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

答案 9 :(得分:0)

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

public static double pv(double rate, double numberOfPeriod, double payment) {
    double retval = 0;
    boolean t = false;
    if (rate == 0) {
        retval = -1*((numberOfPeriod*payment));
    }
    else {
        double r1 = rate + 1;
        retval =
                (( ( 1 - Math.pow(r1, numberOfPeriod) ) / rate ) * (t ? r1 : 1)  * payment - 0) 
                /
                Math.pow(r1, numberOfPeriod);
    }
    return retval;
}