我一直在使用堆栈溢出等其他问题的代码,例如here和here。
当我尝试运行我的函数时,我得到了我在开发者控制台中可以看到的错误Uncaught TypeError: Cannot read property 'length' of undefined
。这个错误在jQuery文件本身内,据说不在我的代码中。 (我知道它在某处仍然是我自己的错误。)
这是我正在尝试执行的代码:
function populate_api(){
var json = (function () {
var json = null;
$.ajax({
'async': false,
'global': false,
'url': "test.txt",
'dataType': "json",
'success': function (data) {
json = data;
}
});
return json;
})(); //^-from SOflow: https://stackoverflow.com/questions/2177548/load-json-into-variable
//Put the JSON into a variable ---^
$.each(json.result.matches.players, function(i, v){
if (v.account_id == 38440257) {
alert(v.hero_id);
return;
}
}); //use variable to run a search on the JSON tree --^
}
带有Json的文件本身有很多信息,但这是我测试过的文件顶部的小区域:
{
"result": {
"status": 1,
"num_results": 10,
"total_results": 500,
"results_remaining": 490,
"matches": [
{
"match_id": 514348401,
"match_seq_num": 468628758,
"start_time": 1392061295,
"lobby_type": 7,
"players": [
{
"account_id": 38440257,
"player_slot": 0,
"hero_id": 42
},
...
快速总结一下。我正在搜索匹配树中帐户ID为38440257
的“hero_id”。
答案 0 :(得分:1)
这是因为json.result.matches.players
是undefined
而jQuery.each()
没有对第一个参数undefined
进行任何检查,而是假设你传递了一些有效的参数它可以访问。{/ p>的length
属性
在您的JSON json.result.matches
中是一个对象数组(每个对象代表一个匹配项),每个对象都有players
属性;数组本身没有具有players
属性。你需要首先遍历每个匹配,然后遍历每个匹配者:
$.each(json.result.matches, function(index, match) {
$.each(match.players, function(i, v) {
// code here
});
});
或者只是检查球员的特定比赛(在这种情况下,第一个):
$.each(json.result.matches[0].players, function(i, v) {
// code here
});
您还应该远离同步AJAX调用(这种荒谬的概念......),而是使用成功回调函数中的数据处理逻辑调用函数,并传入JSON。
答案 1 :(得分:1)
在使用之前,您始终可以检查json
是否未定义,如下所示:
if (typeof json != 'undefined') {
// Do things with json
}
你可以将它包装在你的成功回调中,并在使用之前检查data
是否已定义,同时跳过return json
部分:
function populate_api() {
$.ajax({
'async': false,
'global': false,
'url': "test.txt",
'dataType': "json",
'success': function (data) {
if (typeof data != 'undefined') {
$.each(data.result.matches, function (i, v) {
v.players.forEach(function(player){
if (player.account_id == 38440257) {
alert(player.hero_id);
}
});
});
}
}
});
}
答案 2 :(得分:0)
您正在获取“success”函数之外的json变量值,因此它将在ajax调用结束之前执行。尝试改变这种方式:
'success': function (json) {
return json;
}
});