JavaScript - 比较两个数组

3

我看到很多关于如何在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

基本上,我想找到与上述相反的结果。如果我找不到匹配项,我想执行某个操作。那么我的else语句应该放在哪里?

   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;                                                                              
                }                                                                                         
            }                                                                                             
        }

这是我到目前为止所做的,我是否走在正确的轨道上?

4
[1, 2, 3, 5][4, 7, 5, 5]中如何得到[5, 7] - Ry-
编写一个嵌套循环,其中迭代这两个数组。如果找到匹配项,请更新标志。 - TGH
minitech - 我的错误,我本意只想返回4和7 - 已更新主贴。 - MonsterWimp757
5个回答

8
你想要检查数组a[]的任何元素值是否存在于数组b[]中,如果没有匹配项,则希望在此条件下执行某些操作。有许多不同的方法可以考虑“无匹配”条件。
在你的第一个示例中,每次找到匹配项时都会执行某些操作,它将检查a[]的每个元素的值,并将该值与b[]的所有元素进行逐一比较。因此,这种比较过程不依赖于匹配的位置。而且,如果a[]中特定元素的值存在于b[]的多个位置,或者b[]中特定元素的值存在于a[]的多个位置,则代码将为相同元素的多个匹配执行某些操作。
因此,在您提供的示例数据的情况下:
var a = [1,2,3,5];
var b = [4,7,5,5];

当代码发现a[]的“第四个”元素与b[]的“第三个”元素匹配时,它将执行“某些操作”,然后再次执行“某些操作”当代码发现a[]的“第四个”元素与b[]的“第四个”元素匹配时。我认为这就是您想要的方式,但如果您只想在a[]中的元素在b[]中的一个或多个位置被找到时“执行某些操作”一次,则只需要在“执行某些操作”的语句后立即添加一个“break;”语句。

因此,对于您的问题,您说您想要“相反的”效果:当您找不到匹配项时,“执行某些操作”。

如果您字面上这样理解,那么您只需更改语句:"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
        }
    }
}

另一个可能性是,如果在b[]中无法找到任何元素的值与a[]的元素之一相匹配,您希望“做某事”。为此,您需要检查a[]的每个元素的值,并逐个将其与b[]的所有元素进行比较,如果在检查b[]的所有元素的值后,您找不到与当前元素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"
}

第三种可能性是,如果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;

感谢您的帮助 - 我的情况特别是第三种,这对我有很大帮助。 - MonsterWimp757

4

我不确定你是如何从 [1, 2, 3, 5][4, 7, 5, 5] 中得到 [5, 7] 的,但你可以使用 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


1
compareArrays([1,2,3,5], [5,3,2,1]) 这种情况下,some 方法还能正常工作吗? - Chef_Code
@Chef_Code 我试过了,它不起作用。我也在寻找与您要求相同的工具。 - Aakash Verma

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/


1

误解了问题。这个回答说明了如何在两个数组没有交集时执行某些操作。

如果我找不到匹配项,我想执行一个动作。

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

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语句应该放在哪里?

你实际上不能在这里使用else语句。如果你不想使用帮助函数,你需要使用一个布尔变量来存储循环是否找到匹配项,然后进行测试。@Bhavesh的答案中有一个例子(尽管它没有提前退出循环)。

然而,还有一种更有趣的控制结构:标记语句

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
}

1
如果没有找到匹配项,我想执行一个操作。 最简单的方法是使用帮助函数。幸运的是,这样的函数已经存在于查找数组中的项目中:
for(var i=0;i<a.length;i++)
    if (b.indexOf(a[i]) == -1) // not found
        // do something

我的else语句应该放在哪里?

你实际上不能在这里使用else语句。如果你不想使用帮助函数,你需要使用一个布尔变量来存储循环是否找到匹配项,然后进行测试。@Bhavesh的答案中有一个示例(尽管它没有提前退出循环)。

然而,还有一种更有趣的控制结构:标记语句

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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接