Javascript 尝试访问JSON项时未定义

Javascript 尝试访问JSON项时未定义,javascript,jquery,json,underscore.js,Javascript,Jquery,Json,Underscore.js,我试图获取一个JSON并访问它的对象来检索数据,我的所有路径似乎都运行良好,但有一条路径没有运行。我刚刚检查过,路径与我试图访问的其他对象相同,结果在控制台中我一直没有定义。如果你们能告诉我代码有什么问题,我会很感激的。我会给你们留下JSON结构和java脚本。我希望你们能帮助我弄清楚,如果你们能给我一些关于编码的提示,我也会很好,因为我正在学习 Java脚本: 当您单击列表中的某个项目时,将调用此函数 function checkUser(){ console.log("clicked

我试图获取一个JSON并访问它的对象来检索数据,我的所有路径似乎都运行良好,但有一条路径没有运行。我刚刚检查过,路径与我试图访问的其他对象相同,结果在控制台中我一直没有定义。如果你们能告诉我代码有什么问题,我会很感激的。我会给你们留下JSON结构和java脚本。我希望你们能帮助我弄清楚,如果你们能给我一些关于编码的提示,我也会很好,因为我正在学习

Java脚本: 当您单击列表中的某个项目时,将调用此函数

function checkUser(){
    console.log("clicked");
    var user = $(this).html();
    $.getJSON("js/options.json", function(json){
        var itemsLength = json.chat.OnlineContacts.length;
        for ( var i = 0; i < itemsLength; i++) {
            var jsonUserName = json.chat.OnlineContacts[i].name;
            var jsonUserStatus = json.chat.OnlineContacts[i].status;
            var jsonUserAvatar = json.chat.OnlineContacts[i].avatar;
            if(user == jsonUserName){
                /*displayChatWindow(jsonUserName, jsonUserStatus, jsonUserAvatar);*/
                console.log(jsonUserAvatar);
             }
         };
    });
}

function displayChatWindow(user, status, avatar){
    /*var template = _.template($("#windowTemplate").html(), {userName: user, userStatus: status, userAvatar: avatar});
    $("body").prepend(template);*/
    $(".messages-container").slimScroll({
        height: '200',
        size: '10px',
        position: 'right',
        color: '#535a61',
        alwaysVisible: false,
        distance: '0',
        railVisible: true,
            railColor: '#222',
        railOpacity: 0.3,
        wheelStep: 10,
        disableFadeOut: false,
        start: "bottom"     
    });
}

当我尝试在avatar上执行console log(如示例中所示)时,我只是没有定义,但如果执行console.log(名称或状态y),则只需获得正确的值。

考虑重新构造原始JSON对象,以便您可以通过用户的唯一id直接访问用户-在这种情况下,它似乎是名称

例如:

{
    "chat": {
        "NumberOfOnlineContacts": "7",
        "NumberOfOfflineContacts": "800",
        "OnlineContacts": [
            {
                "Nandy Torres" : {
                    "status": "online",
                    "avatar": "img/profile-picture2.jpg"
                }
            },
            {
                "Catherine Varela" : {
                    "status": "Busy",
                    "avatar": "img/profile-picture3.jpg"
                }
            },
            {...}
        ]
    }
}
可以通过以下方式访问,而无需花费循环费用:

json.chat.OnlineContacts[0].avatar
json.chat.OnlineContacts["Nandy Torres"].avatar
json.chat.OnlineContacts[user].avatar
这里有一个明显的成本效益,但您也可以通过使用attr这个名称来充分利用这两者:

"Nandy Torres" : {
    "name": "Nandy Torres",
    "status": "online",
    "avatar": "img/profile-picture2.jpg"
}
最终转向更正式的唯一id:

"123abc" : {
    "name": "Nandy Torres",
    "status": "online",
    "avatar": "img/profile-picture2.jpg"
}

构建JSON有很多很好的方法,可以考虑重新构造原始JSON对象,这样您就可以通过用户的唯一id直接访问用户——在本例中,它似乎是名称

例如:

{
    "chat": {
        "NumberOfOnlineContacts": "7",
        "NumberOfOfflineContacts": "800",
        "OnlineContacts": [
            {
                "Nandy Torres" : {
                    "status": "online",
                    "avatar": "img/profile-picture2.jpg"
                }
            },
            {
                "Catherine Varela" : {
                    "status": "Busy",
                    "avatar": "img/profile-picture3.jpg"
                }
            },
            {...}
        ]
    }
}
可以通过以下方式访问,而无需花费循环费用:

json.chat.OnlineContacts[0].avatar
json.chat.OnlineContacts["Nandy Torres"].avatar
json.chat.OnlineContacts[user].avatar
这里有一个明显的成本效益,但您也可以通过使用attr这个名称来充分利用这两者:

"Nandy Torres" : {
    "name": "Nandy Torres",
    "status": "online",
    "avatar": "img/profile-picture2.jpg"
}
最终转向更正式的唯一id:

"123abc" : {
    "name": "Nandy Torres",
    "status": "online",
    "avatar": "img/profile-picture2.jpg"
}

Jhonnatan网站上有很多构建JSON的好主意,我很高兴你的代码能够正常工作。所以这并不是你最初问题的答案。但是你也询问了编码技巧以及如何改进。您正在寻找改进代码的方法,这太好了

这里有一个建议,一种编写checkUser函数的更简单方法。这只是您的函数的直接转换,应该使用相同的数据格式

function checkUser() {
    console.log( "clicked" );
    var user = $(this).html();
    $.getJSON( "js/options.json", function( json ) {
        $.each( json.chat.OnlineContacts, function( i, contact ) {
            if( user == contact.name ) {
                displayChatWindow( contact.name, contact.status, contact.avatar );
                console.log( contact.avatar );
             }
         });
    });
}
请注意,contact对象的使用使得无需创建所有这些jsonUserXxxx变量,因为类似contact.avatar的代码与jsonUserAvatar一样简单明了

我还强烈建议您从更具战略性的角度看待如何最好地构建JSON数据的问题


更多相关阅读:我在今天早些时候的回复中发布。

Jhonnatan,我很高兴您的代码能够正常工作。所以这并不是你最初问题的答案。但是你也询问了编码技巧以及如何改进。您正在寻找改进代码的方法,这太好了

这里有一个建议,一种编写checkUser函数的更简单方法。这只是您的函数的直接转换,应该使用相同的数据格式

function checkUser() {
    console.log( "clicked" );
    var user = $(this).html();
    $.getJSON( "js/options.json", function( json ) {
        $.each( json.chat.OnlineContacts, function( i, contact ) {
            if( user == contact.name ) {
                displayChatWindow( contact.name, contact.status, contact.avatar );
                console.log( contact.avatar );
             }
         });
    });
}
请注意,contact对象的使用使得无需创建所有这些jsonUserXxxx变量,因为类似contact.avatar的代码与jsonUserAvatar一样简单明了

我还强烈建议您从更具战略性的角度看待如何最好地构建JSON数据的问题


更多相关阅读:我在今天早些时候的回复中发布。

哪条路径不起作用?请具体说明你的想法questions@ExplosionPills我相信json.chat.OnlineContacts[I]。根据console.log语句判断,avatar是不起作用的路径。是的,我在问题的末尾指定了,当我尝试在avatar上进行控制台登录时,就像在示例中一样,我只是没有定义,但是如果我使用名称或状态y的console.log,只需获得正确的值。如果我将JSON中的名称更改为picture,并将路径更改为picture,我会得到console.log,但如果我对我注释的行取消注释,我会得到一个错误,上面写着:ReferenceError:jsonUserAvatar未定义。@JhonnatanGonzalezRodriguez您确定给我们的JSON是正确的吗@ExplosionPills是的,这是正确的JSOn,我想问题出在下划线变量上,它们设置错误,我只是更改了它们,知道一切都正常,谢谢大家……如果我做得很好或者很糟糕,我也会收到一些建议:哪条路径不正常?请具体说明你的想法questions@ExplosionPills我相信json.chat.OnlineContacts[I]。根据console.log语句判断,avatar是不起作用的路径。是的,我在问题的末尾指定了,当我尝试在avatar上进行控制台登录时,就像在示例中一样,我只是没有定义,但是如果我使用名称或状态y的console.log,只需获得正确的值。如果我将JSON中的名称更改为picture,并将路径更改为picture,我将获得console.log,但是如果我取消注释我注释的行,我将得到一个错误,该错误表示:ReferenceError:jsonUserAvatar不是
已定义。@JhonnatanGonzalezRodriguez您确定给我们的JSON是正确的吗@是的,这是正确的JSOn我想问题出在下划线变量上,它们设置错误,我只是改变了它们,知道一切正常。谢谢你们每一个人……如果我做得很好或者很糟糕,我也会收到一些建议:哇,这真的很酷,因为我所做的被认为是一种可伸缩的,所以以这种方式组织JSON将非常酷,以保持它在未来的真正组织。非常棒的帖子!不过,我绝对建议从一开始就使用唯一的ID,我不认为你想依赖于人们的名字是唯一的。顺便说一句,我们今天一定是处于某种精神状态,因为早些时候我推荐了一个。谢谢迈克尔,关于首先使用唯一id的观点非常好!让我们保持心灵的波长流动:哇,这真的很酷,因为我正在做的是被认为是一种可伸缩的,所以以这种方式组织JSON将是非常酷的,以保持它在未来的真正组织。优秀的帖子!不过,我绝对建议从一开始就使用唯一的ID,我不认为你想依赖于人们的名字是唯一的。顺便说一句,我们今天一定是处于某种精神状态,因为早些时候我推荐了一个。谢谢迈克尔,关于首先使用唯一id的观点非常好!让我们保持心灵的活力:你好,迈克尔,谢谢你花时间回答,并添加所有材料和示例:。当你提到一个物体时,我有一个问题。像contact.avatar一样,我如何将$.getJSON中得到的json转换成像contact={}这样的对象呢。我真的不明白如何将json中的所有数据转换成一个对象,或者是$,每个都是为我做的?如果这个问题不是100%可以理解,我很抱歉,英语不是我的主要语言,所以我做得很好。@JhonnatanGonzalezRodriguez-是的,$。每个都将联系人对象提供给它的回调函数。在您的原始代码中,json.chat.OnlineContacts已经是联系人对象的数组,对吗?这就是为什么可以使用json.chat.OnlineContacts[i]访问其中一个对象,或者使用json.chat.OnlineContacts[i].avatar访问一个化身。$。每个元素都只是在数组中循环,并为每个数组元素调用嵌套回调函数,将数组索引和数组值(联系人对象)作为参数传递给它。顺便说一句,你的英语很好!您好,Michael,感谢您抽出时间回答,并添加所有材料和示例:。当你提到一个物体时,我有一个问题。像contact.avatar一样,我如何将$.getJSON中得到的json转换成像contact={}这样的对象呢。我真的不明白如何将json中的所有数据转换成一个对象,或者是$,每个都是为我做的?如果这个问题不是100%可以理解,我很抱歉,英语不是我的主要语言,所以我做得很好。@JhonnatanGonzalezRodriguez-是的,$。每个都将联系人对象提供给它的回调函数。在您的原始代码中,json.chat.OnlineContacts已经是联系人对象的数组,对吗?这就是为什么可以使用json.chat.OnlineContacts[i]访问其中一个对象,或者使用json.chat.OnlineContacts[i].avatar访问一个化身。$。每个元素都只是在数组中循环,并为每个数组元素调用嵌套回调函数,将数组索引和数组值(联系人对象)作为参数传递给它。顺便说一句,你的英语很好!