2013-07-24 60 views
1

我有這樣的JSON編碼字符串:我的表情有什麼問題?

[{"id":"23","name":"Louis"},{"id":"24","name":"Lucya"}] 

我用這個在$.ajax調用是這樣的:

$.ajax({ 
    type: "GET", 
    dataType:"json", 
    url: "res/main.php", 
    data: { command : "loadPeople" }, 
    success: function(people){ 
      for(var i = 0; i<= people.length; i++){ 
       var tableRow = '<tr><td>' + people[i]['id'] + '</td><td>' + people[i]['name'] + '</td><td style="text-align: right;"><img src="res/img/b_drop.png" width="16" height="16" id="delete_' + people[i]['id'] + '" alt="" onclick="deletePeople('+people[i]['id']+');"/></td></tr>'; 
       $("#people").append(tableRow); 
      } 
    } 
}); 

當我在我的谷歌Chrome瀏覽器網頁與控制檯打開,我得到的以下消息:

Uncaught TypeError: Cannot read property 'id' of undefined 

我的表情有什麼問題?

回答

8

正如它所說people[i]是未定義的。

我假設你因爲測試而超出範圍:<= people.length應該使用<來代替。

嘗試:

for(var i = 0, max = people.length; i < max; ++i) { 
  • 訪問屬性是有點貴(取決於它是如何編碼它可能涉及串comparaison)。將其值存儲在變量中可能會更快。
  • ++i快於i++
+0

更好,使用'$ .each'。 – georg

+0

是的,但$ .each涉及每個元素(i.E分配引用,複製索引等)的函數調用,並創建一個匿名函數,當它可以通過一個簡單的for循環完成。 – Virus721

+0

是的,接受這個答案,因爲它是正確的。 – jgroenen

0

問題CN是長度,因爲一個時間比你的數組長度 更試試這個:

$.ajax({ 
    type: "GET", 
    dataType:"json", 
    url: "res/main.php", 
    data: { command : "loadPeople" }, 
    success: function(people){ 
      for(var i = 0; i<= people.length-1; i++){ 
       var tableRow = '<tr><td>' + people[i]['id'] + '</td><td>' + people[i]['name'] + '</td><td style="text-align: right;"><img src="res/img/b_drop.png" width="16" height="16" id="delete_' + people[i]['id'] + '" alt="" onclick="deletePeople('+people[i]['id']+');"/></td></tr>'; 
       $("#people").append(tableRow); 
      } 
    } 
}); 

或者這樣:

for(var i = 0; i< people.length; i++){ 

} 

的問題,如果你的JSON你不」 t分配ID可以檢查該值是否未定義:

if(people[i]['id']!= undefined){ 
    //code 
} 
+0

這種方式在每個循環中都會增加一個額外的adition和一個額外的布爾測試。 – Virus721

0

改變你的成功的功能是這樣的(之前爲循環):

people = $.parseJSON(people); 
+0

它會自動執行,如果'dataType'設置爲'JSON' – Spokey

0

猜問題是在這裏

for(var i = 0; i<= people.length; i++){ 

     } 

數組索引出界。