【问题标题】:JavaScript - Compare two arrays [duplicate]JavaScript - 比较两个数组[重复]
【发布时间】:2014-01-29 23:10:36
【问题描述】:

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

据我所知,我在正确的轨道上吗?

【问题讨论】:

  • 如何从[1, 2, 3, 5][4, 7, 5, 5] 中得到[5, 7]
  • 编写一个嵌套循环,在其中迭代两个数组。如果找到匹配项,则更新标志。
  • minitech - 我的错误我的意思是只返回 4 和 7 - 更新了主帖。

标签: javascript arrays


【解决方案1】:

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

您可以通过多种不同的方式来考虑“不匹配”的情况。

在您的第一个示例中,每次找到匹配项时都会“做某事”,它将检查 a[] 的每个元素的值,并将该值与 的所有元素进行比较b[],一一。所以,这个比较过程不依赖于匹配的位置。此外,如果 a[] 中特定元素的值存在于 b[] 中的多个位置,或者如果 @987654327 中特定元素的值@ 存在于 a[] 中的多个位置,然后代码将为同一元素的多个匹配中的每一个“做一些事情”。

因此,对于您提供的示例数据:

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

当发现a[]的“4th”元素与b[]的“3rd”元素匹配时,代码将“做某事”,它会再次“做某事”,当它发现 a[] 的“4th”元素与 b[] 的“4th”元素匹配时。我假设这就是您想要的方式,但是如果您只想在 a[] 中的一个元素在 @987654335 内的一个“或多个”位置中找到一次“做某事” @,那么你只需要添加一个“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
        }
    }
}


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

在这种情况下,如果您在 b[] 中找到来自 a[] 的当前值的匹配项,请进一步检查 @ 的那个元素不需要 987654347@。您可能想跳过其余部分,并开始检查 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[]any 元素不能是,您只想“做某事”一次在 b[] 的任何地方找到。为此,您将检查 a[] 的每个元素的值,并将该值与 b[] 的所有元素一一比较,如果在检查后b[] 中所有元素的值找不到与 a[] 的当前元素值匹配的值,设置“标志”并退出所有使用 "break outerloop;" 的循环。那么最后,如果flag被“设置”了,你就可以“做点什么”了。

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;

【讨论】:

  • 感谢您的帮助 - 我的场景特别是第三个,这很有帮助。
【解决方案2】:

我不确定您是如何从[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

【讨论】:

  • compareArrays([1,2,3,5], [5,3,2,1]) 怎么样,some 方法还能用吗???
  • @Chef_Code 我试过了,但它不起作用。甚至我也在寻找与您需要的工作相同的东西。
【解决方案3】:

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

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/

【讨论】:

    【解决方案4】:

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

    如果我没有找到匹配项,我想执行一项操作。

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

    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 的答案有一个例子(尽管它不会提前退出循环)。

    不过,还有一个更有趣的控制结构: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
    }
    

    【讨论】:

      【解决方案5】:

      如果我没有找到匹配项,我想执行一项操作。

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

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

      我的 else 语句会去哪里?

      你不能在这里真正使用 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
      }
      

      【讨论】:

        猜你喜欢
        • 2013-02-02
        • 2021-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多