JavaScript - 比较两个数组

时间:2014-01-29 04:41:49

标签: javascript arrays

我见过很多关于如何在JavaScript中比较两个数组的帖子,如果你找到匹配的话就做点什么。 我想知道如何写相反的东西。 我有两个阵列,当我找不到匹配时我想做点什么。

var a = [1,2,3,5];
var b = [4,7,5,5];


for(i=0;i<a.length;i++){
    for(j=0;j<b.length;j++){
       if(b[j]===a[i]){
          //do something
       }
   }
 }

 //somehow return 4, 7

基本上,我想找到与上述相反的方法。如果我找不到比赛,我想表演一个动作。我的其他声明会在哪里?

   loop1:                                                                                          
        for(var i=0;i<a.length;i++){                                                                                                                        
            loop2:                                                                                        
            for(var j=0;j<b.length;j++){                                                                         
                if(b[j]==a[i]){                                          
                    console.log("break loop");                                                            
                    break loop2;                                                                          
                }                                                                                         
                else{                                                                                     
                    continue loop1;                                                                              
                }                                                                                         
            }                                                                                             
        }

据我所知,我是否走在正确的轨道上?

5 个答案:

答案 0 :(得分:7)

您想要检查数组 a[] 中任何元素的值是否存在于数组 b[] 中,并且您想要“做某事” “条件是”不匹配“。

有许多不同的方法可以考虑“不匹配”的情况。

在你的第一个例子中,每次找到匹配时“做某事”,它会检查 a[] 的每个元素的值,并将该值与<的所有元素进行比较强> b[] ,一个接一个。因此,此比较过程不依赖于匹配的位置。此外,如果 a[] 中的特定元素的值存在于 b[] 中的多个位置,或者<?中的特定元素的值strong> b[] 存在于 a[] 中的多个位置,然后代码将为同一元素的多个匹配中的每个匹配“执行某些操作”。

因此,就您提供的样本数据而言:

var a = [1,2,3,5];
var b = [4,7,5,5];

a[] 的“第4个”元素与 b[] 的“第3个”元素匹配时,代码将“执行某些操作”当它发现 a[] 的“第4个”元素与 b[] 的“第4个”元素匹配时,它会再次“做某事” 。我认为这就是你想要它的方式,但如果你只想在中的一个“或多个”位置找到 a[] 中的元素,那么一次性“做某事” b[] ,那么您只需要添加“中断”;声明,紧接着“做某事”声明。

所以,对于你的问题,你说过,你想要“反对”:当你找不到匹配时“做某事”。

从字面上理解,您只需将声明: "if(b[j]===a[i])" 更改为: "if(b[j] != a[i])" 。现在,这可能你想要什么,因为“不匹配”的情况可能会经常发生:

for(i=0;i<a.length;i++){
    for(j=0;j<b.length;j++){
        if(b[j] != a[i]){
            // do something
        }
    }
}


另一种可能性是,如果在 a[] 中的任何地方找不到 b[] 元素的值,您想要“做某事” 。为此,您将检查 a[] 的每个元素的值,并将该值逐一与 b[] 的所有元素进行比较,如果在检查 b[] 中所有元素的值后,您找不到与 a[] 的当前元素值匹配的内容, 然后 你会“做点什么”。

在这种情况下,如果您在 a[] 中找到了 b[] 的当前值的匹配项,则进一步检查该元素 a[] 没有必要。您可以跳过剩下的部分,然后开始检查 a[] 的下一个元素到 b[] 的元素。为此,您需要使用 "continue outerloop;"

outerloop:
for(i=0;i<a.length;i++){
    for(j=0;j<b.length;j++){
        if(b[j] === a[i]){
            continue outerloop;
        }
    }
    // if we get to here, then no value
    // of b[] matched the a[] value, so:
    // "do something"
}


第三种可能性是,如果 <{em> a[] 任何 元素,您只想“做一些事情”可以在 b[] 的任何位置找到。为此,您将检查 a[] 的每个元素的值,并将该值逐一与 b[] 的所有元素进行比较,如果在检查 b[] 中所有元素的值后,您找不到与 a[] 的当前元素值匹配的内容,你设置一个“标志”并使用 "break outerloop;" 退出所有循环。然后在最后,如果标志是“设置”,你可以“做某事”。

bflag=false;
outerloop:
for(i=0;i<a.length;i++){
    for(j=0;j<b.length;j++){
        if(b[j] === a[i]){
            continue outerloop;
        }
    }
    // if we get to here, then no value
    // of b[] matched the a[] value, so, 
    // set the flag (bflag)
    bflag=true;
    break outerloop:
}

if(bflag){
    // "do something"
}

如果将此代码作为函数调用,则可以简化一下:

outerloop:
for(i=0;i<a.length;i++){
    for(j=0;j<b.length;j++){
        if(b[j] === a[i]){
            continue outerloop;
        }
    }
    // if we get to here, then no value of b[] matched 
    // the a[] value, so, do-something and return "failed":
    // "do something"
    return false;
}

// all elements of a[] were matched to 
// elements of b[], so: return "success"
return true;

答案 1 :(得分:4)

我不确定你是如何从[5, 7][1, 2, 3, 5]中获得[4, 7, 5, 5]的,但你可以使用Array.prototype.some方法比较两个数组:

function compareArrays(a, b) {
    return !a.some(function (e, i) {
        return e != b[i];
    });
}

如果两个数组相同,则返回true,否则会得到false

所以compareArrays([1,2,3], [1,2,3])会返回true,而compareArrays([1,2,3, 5], [4,5,7,7])会返回false

答案 2 :(得分:1)

你的代码中的答案有点接近。请找下面的代码:

var a = [1,2,3,5];
var b = [4,7,5,5];

for(i=0;i<a.length;i++)
{
    var bl = false;
    for(j=0;j<b.length;j++)
    {
        if(a[i] == b[j])
        {
            bl = true;
        }
     }

    if(bl)
        alert("find match for : " + a[i]);
}

尝试这个FIDDLE http://jsfiddle.net/Ce7HB/2/

答案 3 :(得分:1)

  

如果我找不到比赛,我想表演。

最简单的方法是使用辅助函数。幸运的是,such已经存在,用于查找数组中的项目:

for(var i=0;i<a.length;i++)
    if (b.indexOf(a[i]) == -1) // not found
        // do something
  

我的其他声明会去哪里?

你不能在这里使用else语句。如果你不想使用辅助函数,你需要使用一个布尔变量来存储循环是否找到匹配,然后测试它。 @Bhavesh的回答有一个例子(虽然它不会提前退出循环)。

但是,有一个更有趣的控制结构:labelled statements

for(var i=0;i<a.length;i++)
    foundNothing: {
        for(var j=0;j<b.length;j++)
            if(b[j]===a[i])
                break foundNothing;
         // else we're still here when the block was not "broken"
         // do something
    }

但是,我们可以通过对某个循环使用continue语句来更容易地表达。如果我们找到了一个特定的项目,我们只需要转到下一个项目 - 如果我们没有离开,我们就没有找到任何东西。

tofind: for(var i=0;i<a.length;i++) {
    for(var j=0;j<b.length;j++)
        if(b[j]===a[i])
             continue tofind;
    // else we're still here
    // do something
}

答案 4 :(得分:0)

误解了这个问题。这回答了当找不到两个数组之间的交集时如何执行某些操作。

  

如果我找不到比赛,我想表演。

最简单的方法是使用辅助函数:

function findEqual(a, b) {
  for(var i=0;i<a.length;i++)
    for(var j=0;j<b.length;j++)
      if(b[j]===a[i])
        return true;
  return false;
}

if (!findEqual(a, b)) {
  // do something
}
  

我的其他声明会去哪里?

你不能在这里使用else语句。如果你不想使用辅助函数,你需要使用一个布尔变量来存储循环是否找到匹配,然后测试它。 @Bhavesh的回答有一个例子(虽然它不会提前退出循环)。

但是,有一个更有趣的控制结构:labelled statements

foundNothing: {
  for(var i=0;i<a.length;i++)
    for(var j=0;j<b.length;j++)
      if(b[j]===a[i])
        break foundNothing;
  // else we're still here when the block was not "broken"
  // do something
}