Javascript 尝试访问JSON项时未定义
我试图获取一个JSON并访问它的对象来检索数据,我的所有路径似乎都运行良好,但有一条路径没有运行。我刚刚检查过,路径与我试图访问的其他对象相同,结果在控制台中我一直没有定义。如果你们能告诉我代码有什么问题,我会很感激的。我会给你们留下JSON结构和java脚本。我希望你们能帮助我弄清楚,如果你们能给我一些关于编码的提示,我也会很好,因为我正在学习 Java脚本: 当您单击列表中的某个项目时,将调用此函数Javascript 尝试访问JSON项时未定义,javascript,jquery,json,underscore.js,Javascript,Jquery,Json,Underscore.js,我试图获取一个JSON并访问它的对象来检索数据,我的所有路径似乎都运行良好,但有一条路径没有运行。我刚刚检查过,路径与我试图访问的其他对象相同,结果在控制台中我一直没有定义。如果你们能告诉我代码有什么问题,我会很感激的。我会给你们留下JSON结构和java脚本。我希望你们能帮助我弄清楚,如果你们能给我一些关于编码的提示,我也会很好,因为我正在学习 Java脚本: 当您单击列表中的某个项目时,将调用此函数 function checkUser(){ console.log("clicked
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访问一个化身。$。每个元素都只是在数组中循环,并为每个数组元素调用嵌套回调函数,将数组索引和数组值(联系人对象)作为参数传递给它。顺便说一句,你的英语很好!