2009-03-01 164 views
1

我現在無法處理我的for循環,我試圖比較兩個數據,基本上它會比較兩個項目,然後它會寫網頁上的匹配和不匹配。爲什麼我的嵌套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

我期待它顯示錯誤,而不是所有的字符串。

+0

您需要定義 '匹配' 和 '不匹配' 的好一點。如果一個項目在i1中,而不是在i2中,它是不匹配的,還是位置也很重要? – Triptych 2009-03-01 16:58:59

+0

你是否對i2中的東西感興趣,但不是'i1'?如果你是那麼你缺少它的代碼。請參閱下面的答案。 – 2009-03-02 14:38:24

回答

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數組包含它們自己的長度屬性,因此您不需要將計數傳遞給HTML編寫器。當作者收到這些數組時,它可以請求每一個.length屬性知道每個數組有多大。

0

我有一種感覺,這與使用「!==」,而不是你的第二個做對比「!=」

「!==」是逆「===」,而不是「 ==」。 !==是一個比較嚴格的比較,它不會進行任何類型的投射。例如(5!='5')爲假,其中as(5!=='5')爲真。這意味着你可能會推動嵌套循環中的兩個數組,因爲if(i1 [i] == i2 [j])和if(i1 [i]!== i2 [j])都可能爲真與此同時。

1

不直接相關的問題,但你應該看到這一點: Google techtalks about javascript

也許會啓發你:)

+0

你釘了我,我現在實際上看着它。我發現它在黑客新聞 – 2009-03-01 17:15:21

0

這裏的根本問題是一對嵌套循環是不是正確的做法。

您需要遍歷每個數據集中的指針。 ONE循環根據需要同時進行。

請注意,找出哪些在不匹配的情況下前進是一個比簡單地通過它們更大的問題。發現第一個不匹配不是問題,找到它後很難回到正確的位置。

1

幾件事關於你的問題。首先,您應該使用'!='而不是'!=='來檢查不平等。其次,我不確定你爲什麼將計數減2,表明陣列中可能有重複?!無論如何,你的邏輯是錯誤的,後來Jarrett糾正了這個錯誤,但那也不是完全正確/完整的答案。預先閱讀。

您的任務聽起來像是「給定兩組數組i1 & i2找到i1 {交集} i2和i1 {破折號} {UNION} i2 {破折號})(羣組理論符號)。在

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 {}衝刺到I1 {}短跑

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