为什么我的嵌套for循环不能像我预期的那样工作?

时间:2009-03-01 16:50:06

标签: javascript

我现在无法处理我的for循环,我正在尝试比较两个数据,基本上它会比较两个项目,然后它会在网页上写下匹配和不匹配。

我设法在网页上写了比赛,但它运作良好。但是我的不匹配比较中存在一个错误。

它在网页上写了X次所有数据,这是我的JS代码:

function testItems(i1, i2) {
    var newArray = [];
    var newArray2 = [];
    var count = 0;
    var count2 = 0;
    for(var i = 0; i < i1.length; i++) {
        for(var j = 0; j < i2.length; j++) {
            if(i1[i] == i2[j]) {
                newArray.push(i1[i]);
                count++;
            } if (i1[i] !== i2[j]) {
                newArray2.push(i1[i]);
                count2++;
            }
        }
    }
    count-=2;
    count2-=2
    writeHTML(count,count2, newArray, newArray2);
}

结果对于不匹配很可怕:

alt text http://www.picamatic.com/show/2009/03/01/07/44/2523028_672x48.jpg

我期待它显示错误,而不是所有字符串。

5 个答案:

答案 0 :(得分:3)

您看到的问题是由于嵌套的for循环。你实际上是在进行交叉比较:对于i1中的每个项目,你将它与i2中的每个项目进行比较(记住,每当我前进时j再次从0开始......两个循环不并行运行)。

由于我从下面的评论中了解到你希望能够将一个数组与另一个数组进行比较,即使每个数组中的项目顺序不同,我也编辑了我的原始建议。请注意,下面的代码段不会规范两个数组之间的差异...不知道这是否是一个问题。另请注意,它只将i1与i2进行比较...不是i1到i2和i2到i1,这会使任务更具挑战性。

function testItems(i1, i2) {

    var newArray = [];
    var newArray2 = [];

    for (var i = 0; i < i1.length; i++) {
        var found = false;
        for (var j = 0; j < i2.length; j++) {
            if (i1[i] == i2[j]) found = true;
        }
        if (found) {
            newArray.push(i1[i])
        } else {
            newArray2.push(i1[i])
        }
    }
}

作为替代方案,您可以考虑使用哈希表来索引i1 / i2,但由于注释中的字符串示例包含空格,我不知道您是否使用任何javascript帮助程序库,因此它可能是最好的坚持使用嵌套的for循环。该片段也没有尝试清除重复项。

您可能考虑的另一个优化是newArray和newArray2数组包含自己的length属性,因此您无需将计数传递给HTML编写器。当编写器接收到数组时,它可以询问每个数组的.length属性,以了解每个数组的大小。

答案 1 :(得分:1)

与问题没有直接关系,但您应该看到: Google techtalks about javascript

也许它会启发你:)

答案 2 :(得分:1)

关于你的问题的一些事情。首先,您应该使用'!='而不是'!=='来检查不等式。其次,我不确定你为什么减少数量减少2,对我来说,阵列中可能有重复数据?!无论如何你的逻辑是错误的,后来由Jarrett纠正,但这也不是一个完全正确/完整的答案。预读。

你的任务听起来像“给定两组数组i1和i2来找到i1 {intersection} i2和i1 {dash} {UNION} i2 {dash})(组理论符号)。即你想要列出常见元素in newArray和newArray2中不常见的元素。

你需要这样做。

1)删除两个阵列中的重复项。 (为了以后提高程序效率)(这不是必须得到所需的结果 - 你可以跳过它)

i1 = removeDuplicate(i1);
i2 = removeDuplicate(i2);

(未给出removeDuplicate的实现)。

2)通过i1并找到i1 {dash}和i1 {intersection} i2。

    var newArray = []; 
    var newArray2 = [];

    for (var i = 0; i < i1.length; i++) 
    {
        var found = false;
        for (var j = 0; j < i2.length; j++) 
        {
            if (i1[i] == i2[j]) 
           { 
              found = true;
              newArray.push(i1[i]); //add to i1 {intersection} i2.
              count++;
              break; //once found don't check the remaining items
           } 
        }

        if (!found)         
        {
            newArray2.push(i1[i]); //add i1{dash} to i1{dash} {UNION} i2{dash}
            count2++;[           
        }
    }

3)通过i2并将i2 {dash}追加到i1 {dash}

  for(var x=0; x<i2.length; x++)
{
    var found = false;

    //check in intersection array as it'd be faster than checking through i1
    for(var y=0; y<newArray.length; y++)    {
      if( i2[x] == newArray[y])
      {
         found = true;
         break;
      } 
   }

   if(!found) 
   {   
       newArray2.push(i2[x]); //append(Union) a2{dash} to a1{dash}
       count2++;
   }
}   

writeHTML(count,count2, newArray, newArray2);

答案 3 :(得分:0)

我觉得这与你的第二次比较有关,使用“!==”代替“!=”

“!==”是“===”的倒数,而不是“==”。 !==是一个更严格的比较,不进行任何类型的转换。

例如(5!='5')为false,其中(5!=='5')为真。这意味着您可能会在嵌套循环中推送到两个数组,因为if(i1 [i] == i2 [j])和if(i1 [i]!== i2 [j])都可以为真同时。

答案 4 :(得分:0)

这里的根本问题是一对嵌套循环 NOT 是正确的方法。

您需要遍历每个数据集的指针。 一个循环,根据需要推进。

请注意,在不匹配的情况下确定要推进哪个是一个比简单地走过它们要大得多的问题。找到第一个不匹配不是问题,在找到它之后重新回到轨道是非常困难的。