2012-02-28 17 views
1

工作使用下面的代碼,我得到這個錯誤RewardPurchases.PurchasesArray[i].Student_Name is undefinedJavaScript的 - 「變量未定義」在循環的一個部分,在不同的部分

$('button#random').click(function() { 
    var Num = Math.floor(Math.random() * Total+1); 
    Num--; 

    for (var i in RewardPurchases.PurchasesArray) { 
/* --------> */  
     $('#display').text("Ticker number " + Num + " in the LEAP database belongs to...\n\n\n" + RewardPurchases.PurchasesArray[i].Student_Name.toUpperCase() + " (" + TutorGroup + ")").show().delay(300); 

     if (i == Num) { 
      var TutorGroup = ''; 

      Frog.API.get('timetable.getClasses', 
      { 
       'params': {'student': RewardPurchases.PurchasesArray[i].Student_ID }, 
       'onSuccess': function(data) { 
        for (var i = 0; i < data.length; i++) { 
         if (data[i].subject.name == "Tut Period") { 
          TutorGroup = data[i].name.replace("/Tp", ""); 
         } 
        } 
       } 
      }); 

      $('#display').animate({'font-size': 36}, 1500, function() { 
       $(this).prepend('<p>!!! WINNER !!!</p>'); 
      }); 

      alert("Ticker number " + Num + " in the LEAP database belongs to...\n\n\n" + RewardPurchases.PurchasesArray[i].Student_Name.toUpperCase() + " (" + TutorGroup + ")"); 
     } 
    } 
}); 

但是,如果我搬到這條線$('#display').text(...如下,錯誤消失:

$('button#random').click(function() { 
    var Num = Math.floor(Math.random() * Total+1); 
    Num--; 

    for (var i in RewardPurchases.PurchasesArray) { 

     if (i == Num) { 
      var TutorGroup = ''; 
/* --------> */   
      $('#display').text("Ticker number " + Num + " in the LEAP database belongs to...\n\n\n" + RewardPurchases.PurchasesArray[i].Student_Name.toUpperCase() + " (" + TutorGroup + ")").show().delay(300); 

      Frog.API.get('timetable.getClasses', 
      { 
       'params': {'student': RewardPurchases.PurchasesArray[i].Student_ID }, 
       'onSuccess': function(data) { 
        for (var i = 0; i < data.length; i++) { 
         if (data[i].subject.name == "Tut Period") { 
          TutorGroup = data[i].name.replace("/Tp", ""); 
         } 
        } 
       } 
      }); 

      $('#display').animate({'font-size': 36}, 1500, function() { 
       $(this).prepend('<p>!!! WINNER !!!</p>'); 
      }); 

      alert("Ticker number " + Num + " in the LEAP database belongs to...\n\n\n" + RewardPurchases.PurchasesArray[i].Student_Name.toUpperCase() + " (" + TutorGroup + ")"); 
     } 
    } 
}); 

我不明白爲什麼會出現這種情況? i沒有被if聲明定義?

我試圖顯示數組中的每個名稱,然後選擇一個隨機名稱並以「WINNER!」的大字體顯示它。它上面。

由於提前,

+1

你是否認爲RewardPurchases.PurchasesArray [i]的值爲「Student_Name」。可能未定義? – VirtualTroll 2012-02-28 15:54:09

+0

您是否嘗試過記錄我,看看它們在兩種情況下的值?有沒有可能你的內部循環覆蓋了我的外部循環值? – thescientist 2012-02-28 15:54:39

+0

我最初的想法是錯誤消失,因爲違規行在if(i == Num)塊內。檢查以確保if塊內的代碼實際上正在執行,然後更新您的問題。這不會解決問題,但它有助於追蹤。 – Zoidberg 2012-02-28 15:55:08

回答

1

你是什麼樣陣列的完整性?

//RewardPurchases.PurchasesArray 
[0] undefined 
[1] { Student_Name: undefined } 
[2] { Student_Name: 'Bob' } 

以上都是在數組中有效。 [0][1]都會給你你收到的錯誤。

如果PurchasesArray不是一個數組而是一個對象 - 那麼您需要在循環中進行檢查。

for (var i in RewardPurchases.PurchasesArray) { 
    if(!RewardPurchases.PurchasesArray.hasOwnProperty(i)) { 
    continue; 
    } 

    //rest of code... 
} 
+0

根據他對跨瀏覽器支持的需求,'hasOwnProperty'可能/可能不是最佳選擇。 – 2012-02-28 16:08:18

+0

不過,他可以添加它,就像數組的「indexOf」一樣。立場糾正。:) – 2012-02-28 16:15:14

+0

我收回了我的評論,因爲它引入了一個新的參數 - 擴展Object.prototype:p但是,他可以創建一個墊片以檢查這是否是一個問題...總是必須考慮跨瀏覽器問題' = /' – 2012-02-28 16:16:15

2

使用for .. in不是這些情況下的最佳做法。它可以深度挖掘ALL對象屬性,包括屬於原型的函數。

只有$('#display').text(...會導致您的問題的原因是您嘗試使用屬性RewardPurchases.PurchasesArray [i]的屬性。在其他地方,你自己使用它,這不會失敗,在這種情況下,它會靜靜地返回undefined。 (又名,'params': {'student': RewardPurchases.PurchasesArray[i].Student_ID }。)

使用您包裝所有的代碼裏面測試你的..在循環,typeof RewardPurchases.PurchasesArray[i] === 'object' && typeof RewardPurchases.PurchasesArray[i] !== null應該做的伎倆,確保每您在重複使用屬性是一個簡單的對象,而不是一個函數或某個「標量」值。

注意:您也可以使用RewardPurchases.PurchasesArray[i].hasOwnProperty('propertyName'),但它在所有瀏覽器中都不受支持,所以上面給出的示例更安全並且適用於您的目的。

+1

我同意這可能是問題所在,但更好的解決方案是不使用'for ... in'。 – 2012-02-28 16:03:33

+0

是的。如果它是一個數字索引數組,那麼真的沒有理由使用'for .. in'。然而,'for .. in'是迭代對象屬性的唯一方法。在這種情況下,它看起來並不像他正在試圖這麼做......所以,是的,在這裏最好的選擇是「更好的選擇」。 – 2012-02-28 16:06:37