我有一个包含两个嵌套动态密钥的var数据。
我没有读取密钥的内容值" key_1"
var A = '"' + 123456789 + '"';
var B = '"' + 987654321 + '"';
var AA = '"' + 42 + '"';
var data = {
"123456789":{
"42":{
"key_1":"value_1",
"key_2":"value_2",
"key_3":"value_3"
},
"DYNAMIC_KEY_2":{
"key_1":"value_1",
"key_2":"value_2",
"key_3":"value_3"
},
"DYNAMIC_KEY_3":{
"key_1":"value_1",
"key_2":"value_2",
"key_3":"value_3"
}
},
"987654321":{
"DYNAMIC_KEY_1":{
"key_1":"value_1",
"key_2":"value_2",
"key_3":"value_3"
},
"DYNAMIC_KEY_2":{
"key_1":"value_1",
"key_2":"value_2",
"key_3":"value_3"
},
"DYNAMIC_KEY_3":{
"key_1":"value_1",
"key_2":"value_2",
"key_3":"value_3"
}
}
}
alert(data[A][AA]["key_1"]);
未捕获的TypeError: 无法读取属性'" 42"'未定义的
我尝试了几种解决方案,但事实并非如此!
有人可以解释一下如何继续吗?谢谢:))
---更新---
很奇怪,应用你的建议,我仍然有同样的错误...
在我的代码中,var A是一个由函数中的数值变量提供的全局变量(productID)。
var AA也对应于另一个通常作为数字变量的文件中的变量(userID)。
var room;
function ioJoin(Mid){
room = Mid;
var _localuserid = LS.wpbp.id;
var trackdata = {};
var users = {};
users[_localuserid] = {
active: true,
time: $.now(),
user: LS.wpbp.id,
productID: Mid
}
trackdata[Mid] = users
socket.emit('send:newuser', trackdata);
}
socket.on("load:joinroom", function(data) {
var _localuserid = LS.wpbp.id;
// room & _localuserid are numbers
alert(data[room][_localuserid]["active"]);
});
我真的不明白这是什么问题!
答案 0 :(得分:1)
不要在您的媒体名称中加上引号。 '"' + 123456789 + '"'
为您提供值'"123456789"'
(请注意,开头和结尾都是双引号,实际上在字符串中)。你只想要'123456789'
。
所以:
var A = '123456789';
var B = '987654321';
var AA = '42';
直播示例:
var A = '123456789';
var B = '987654321';
var AA = '42';
var data = {
"123456789":{
"42":{
"key_1":"value_1",
"key_2":"value_2",
"key_3":"value_3"
},
"DYNAMIC_KEY_2":{
"key_1":"value_1",
"key_2":"value_2",
"key_3":"value_3"
},
"DYNAMIC_KEY_3":{
"key_1":"value_1",
"key_2":"value_2",
"key_3":"value_3"
}
},
"987654321":{
"DYNAMIC_KEY_1":{
"key_1":"value_1",
"key_2":"value_2",
"key_3":"value_3"
},
"DYNAMIC_KEY_2":{
"key_1":"value_1",
"key_2":"value_2",
"key_3":"value_3"
},
"DYNAMIC_KEY_3":{
"key_1":"value_1",
"key_2":"value_2",
"key_3":"value_3"
}
}
}
alert(data[A][AA]["key_1"]);
对于其中没有前导零的那些,你甚至可以完全取消引号并使用数字(这将被[]
强制转换为字符串)。
直播示例:
var A = 123456789;
var B = 987654321;
var AA = 42;
var data = {
"123456789":{
"42":{
"key_1":"value_1",
"key_2":"value_2",
"key_3":"value_3"
},
"DYNAMIC_KEY_2":{
"key_1":"value_1",
"key_2":"value_2",
"key_3":"value_3"
},
"DYNAMIC_KEY_3":{
"key_1":"value_1",
"key_2":"value_2",
"key_3":"value_3"
}
},
"987654321":{
"DYNAMIC_KEY_1":{
"key_1":"value_1",
"key_2":"value_2",
"key_3":"value_3"
},
"DYNAMIC_KEY_2":{
"key_1":"value_1",
"key_2":"value_2",
"key_3":"value_3"
},
"DYNAMIC_KEY_3":{
"key_1":"value_1",
"key_2":"value_2",
"key_3":"value_3"
}
}
}
alert(data[A][AA]["key_1"]);
答案 1 :(得分:0)
替换:
var A = '"' + 123456789 + '"';
var B = '"' + 987654321 + '"';
var AA = '"' + 42 + '"';
使用:
var A = '' + 123456789;
var B = '' + 987654321;
var AA = '' + 42;
或者更好的是,只需将它们声明为字符串:
var A = '123456789';
var B = '987654321';
var AA = '42';
您不需要添加那些额外的引号,这些引号只会导致像'"123456789"'
这样的字符串,而这些字符串在对象中找不到。
然后它会起作用:
直播示例:
var A = '123456789';
var B = '987654321';
var AA = '42';
var data = {
"123456789":{
"42":{
"key_1":"value_1",
"key_2":"value_2",
"key_3":"value_3"
},
"DYNAMIC_KEY_2":{
"key_1":"value_1",
"key_2":"value_2",
"key_3":"value_3"
},
"DYNAMIC_KEY_3":{
"key_1":"value_1",
"key_2":"value_2",
"key_3":"value_3"
}
},
"987654321":{
"DYNAMIC_KEY_1":{
"key_1":"value_1",
"key_2":"value_2",
"key_3":"value_3"
},
"DYNAMIC_KEY_2":{
"key_1":"value_1",
"key_2":"value_2",
"key_3":"value_3"
},
"DYNAMIC_KEY_3":{
"key_1":"value_1",
"key_2":"value_2",
"key_3":"value_3"
}
}
}
alert(data[A][AA]["key_1"]);
答案 2 :(得分:0)
这不一定是答案,但看看你写alert(data[A][AA]["key_1"]);
的方式,我认为提供更多信息很重要。
第1点: - key_1
如果您需要将密钥key_1
放入变量中,您可以写一下:
var AAA = 'key_1';
alert( data[A][AA][AAA] );
这是正确的。 现在,您可以继续使用其他键进行相同的推理。可视化:
提醒(数据[' 123456789'] [' 42'] [' key_1']);
因此,您可以了解为什么必须var A = '123456789';
和var AA = '42';
。
第2点: - 出发点
现在,当涉及dot
表示法时,不能在以数字[0-1]开头的键上使用点表示法。因此,你不能写:
alert( data.123456789.42.key_1 ); //BAD
但你可以写:
alert( data['123456789']['42'].key_1 ); //GOOD