使用jQuery进行jSON树搜索,错误

时间:2014-02-11 10:25:26

标签: javascript jquery json

我一直在使用堆栈溢出等其他问题的代码,例如herehere

当我尝试运行我的函数时,我得到了我在开发者控制台中可以看到的错误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”。

3 个答案:

答案 0 :(得分:1)

这是因为json.result.matches.playersundefinedjQuery.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;
        }
    });