2013-07-24 33 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++){ 

     } 

数组索引出界。