关于javascript:通过JSON数组循环会产生“未定义”结果

Looping through a JSON Array gives “undefined” results

本问题已经有最佳答案,请猛点这里访问。

我有一个JSON字符串正在从Ajax解析(在responsevar中):

JSON

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
  "TheArray":[  
      {  
        "AlmostThere": {  
           "whatWeAreLookingFor":"Hello"
         }
      },
      {
       "AlmostThere": {
           "whatWeAreLookingFor":"Goodbye"
        }
      }
   ]
}

正在分析的JSON

1
var jsonData = JSON.parse(response); //response is the string version of the JSON code!

现在,我需要循环到JSON数组中,这里称为TheArray。我这样做:

循环排列

1
2
3
for (var contents in jsonData["TheArray"]) {

}

在这里,我们得到了whatWeAreLookingFor元素的值:

1
2
3
for (var contents in jsonData["TheArray"]) {
    console.log(contents.whatWeAreLookingFor +"!");
}

但有一个陷阱!控制台输出…undefined!。-我尝试了多种方法来实现这一点,比如使用contents["whatWeAreLookingFor"]和其他方法,但我仍然得到了相同的结果。


你忘了访问EDOCX1[0]

1
  jsonData.TheArray[i].AlmostThere.whatWeAreLookingFor
1
2
3
for (var i = 0; i < jsonData.TheArray.length; i++) {
    console.log(jsonData.TheArray[i].AlmostThere.whatWeAreLookingFor);
}

for... in迭代对象的键。对于数组,这意味着(大约)索引012等。

您可以使用array.prototype.foreach代替:

1
2
3
jsonData.theArray.forEach(function(contents) {
  console.log(contents.AlmostThere.whatWerAreLookingFor);
})


如果您以自己的方式循环数组TheArray,那么contentsvar将成为这两个对象:

1
2
3
4
5
{  
    "AlmostThere": {  
       "whatWeAreLookingFor":"Hello"
     }
}

1
2
3
4
5
{
   "AlmostThere": {
       "whatWeAreLookingFor":"Goodbye"
    }
}

现在,您要使用

contents.whatWeAreLookingFor

但是对于这些对象,这个属性是未定义的。所以你的控制台记录了undefined。您必须使用它访问值:

1
contents.AlmostThere.whatWeAreLookingFor

因此,您得到对象AlmostThere并选择属性whatWeAreLookingFor

如果使用jquery,则应使用:

1
2
3
$.each(jsonData.TheArray, function() {
     console.log(contents.AlmostThere.whatWeAreLookingFor + '!');
});

API:http://api.jquery.com/jquery.each/