如何判断一个数组中的值是否等于Javascript中另一个数组中的值?

时间:2012-03-29 01:08:57

标签: javascript arrays

在Javascript中,我有2个15个字符串元素的数组,每个元素有0到17个字符。

如何判断这两个数组中第一个数值的某个值是否等于第二个数组的某个值?

示例:

var array1 = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o'];
var array2 = ['z','z','z','z','z','z','z','z','z','z','z','z','z','o','z'];
myFunction(array1,array2); // returns false

示例2:

var array1 = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','s'];
var array2 = ['z','z','z','z','z','z','z','z','z','z','z','z','z','o','z'];
myFunction(array1,array2); // returns true

6 个答案:

答案 0 :(得分:1)

假设dbaupp是正确的并且您有拼写错误,您希望找到两个数组的交集并查看它是否为非空。

两个集合的交集意味着两个原始集合共有的元素集合。如果至少有一个共同的元素,则交集将是非空的。

为此,请参阅

Simplest code for array intersection in javascript

答案 1 :(得分:1)

此代码检查两个列表是否具有公共元素,这是通过对列表进行排序然后逐步执行这些列表来完成的,从而推进任何列表“落后”。

function(list1, list2) {
    var l1 = list1.sort(), l2 = list2.sort(),
        len1 = l1.length, len2 = l2.length,
        i1 = 0, i2 = 0;

    while (i1 < len1 && i2 < len2) {
        if (l1[i1] == l2[i2])
            return true;

        if (l1[i1] < l2[i2])
            i1++;
        else
            i2++;
    }
    return false;
}

NB。正如Eric所说,你也可以只交叉这两个列表,并检查结果列表是非空的,但这里的代码效率会更高,因为它不必生成一个全新的列表,也不必去如果存在共同元素,则通过所有两个列表。

答案 2 :(得分:1)

Eric J.建议的交叉路口可能是解决问题的最佳方式。

您所要求的直接翻译可以像这样工作:

function containsAny(array1, array2) {
  for (var i=0; i<array1.length; i++) {
      for (var j=0; j<array2.length; j++) {
          if (array1[i] == array2[j]) return true;
      }
  }
  return false;
}

var array1 = ['a','b','c'];
var array2 = ['1','2','3'];
var array3 = ['a','b','2'];

containsAny(array1, array2); // returns false
containsAny(array2, array3); // returns true 
containsAny(array1, array3); // returns true

答案 3 :(得分:0)

好吧,假设我正确地理解了你的问题,我把一个小提琴放在一起,它将使用JQuery'each'方法匹配2个数组的元素:

http://jsfiddle.net/phillipkregg/Ug3DM/1/

var array1 = ["a","b","c","o"];
var array2 = ["z","z","b","z","z","o"];

array1.each(function(item){
    var element = item;        
    var match = [];
    array2.each(function(item2) {
        if (item2 === element)
        {
            match.push(item2); 
            alert(match);

        }            
    });                   
});​

也许这会让你开始。

答案 4 :(得分:0)

我尝试在楼上使用'each'方法,但似乎不起作用,而'each'用于对象,而不是数组。 所以我改变了代码。

var array1 = ["a","b","c","o"];
var array2 = ["z","z","b","z","z","o"];
var match = [];
$.each(array1, function(key, val){
var element = val;
    $.each(array2, function(key, val){
    if(element === val)
    {
    match.push(val);
    }
    });
});
$.each(match, function(key, val){
    alert(key+'--'+val);
});

答案 5 :(得分:0)

大多数浏览器使用内置的indexOf和Arrays的过滤方法, 如果你经常使用这些方法,你可以有条件地添加 它们适用于较旧的浏览器。

var array1= ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 's'];
var array2= ['z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'o', 'z'];
var array3= ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'o', 'k', 'l', 'm', 'n', 's'];


1. array1.inCommon(array2)>>
(array length 0)

2. array2.inCommon(array3)>>
(array length 1)
o

3. array3.inCommon(array1)>>
(array length 14)
a, b, c, d, e, f, g, h, i, k, l, m, n, s



Array.prototype.inCommon= function(ar){
    return this.filter(function(itm){
        return ar.indexOf(itm)!= -1;
    });
}

Array.prototype.indexOf= Array.prototype.indexOf || function(what, i){
    if(typeof i!= 'number') i= 0;
    var L= this.length;
    while(i< L){
        if(this[i]=== what) return i;
        ++i;
    }
    return -1;
}

Array.prototype.filter= Array.prototype.filter || function(fun, scope){
    var T= this, A= [], i= 0, itm, L= T.length;
    if(typeof fun== 'function'){
        while(i< L){
            if(i in T){
                itm= T[i];
                if(fun.call(scope, itm, i, T)) A[A.length]= itm;
            }
            ++i;
        }
    }
    return A;
}