Javascript(node.js):遍历嵌套对象并获得未定义
我使用命令行上的node运行此代码。我现在的问题是,行console.log(checkparam[key].stat)返回的是未定义的值,而不是值 在下面的代码中,我试图显示嵌套在另一个对象中的对象中的一组属性的所有值。问题是我没有定义,因为javascript将“stat”var识别为较低嵌套对象中的文本stat属性,而不是for(var stat in checkparam[key])循环中的stat值 }); 我知道上面提到的for循环中的stat正确地指向了较低嵌套对象中的属性键,因为我只需将它们记录在console.log中,它们就会显示键值。我只是不明白让Javascript认识到我想要记录那个特定值的正确过程是什么 另外,我知道堆栈上的问题应该基于单个特定的问题,但如果有人愿意回答第二个问题,我是否在这里错误地使用了对象?javascript对象的方式在我看来就像python字典或perl哈希一样,因此我一直认为可以像在这些语言中一样嵌套数据 下面是上下文的全部代码Javascript(node.js):遍历嵌套对象并获得未定义,javascript,node.js,loops,object,nested,Javascript,Node.js,Loops,Object,Nested,我使用命令行上的node运行此代码。我现在的问题是,行console.log(checkparam[key].stat)返回的是未定义的值,而不是值 在下面的代码中,我试图显示嵌套在另一个对象中的对象中的一组属性的所有值。问题是我没有定义,因为javascript将“stat”var识别为较低嵌套对象中的文本stat属性,而不是for(var stat in checkparam[key])循环中的stat值 }); 我知道上面提到的for循环中的stat正确地指向了较低嵌套对象中的属性键,因为
//--MODULES
//Readline Sync for CLI prompting
var rlprompt = require('readline-sync');
//--DECLARE OBJECTS //
var fverparty = new Object();
//--DEFINE FUNCS //
//LIST FUNCTION
var list = function (param) {
console.log("Party members: ")
for (var key in param) {
console.log(param[key].playerFirstName);
}
}
//ADD FUNCTION
var add = function (playerFirstName, list, playerLastName, playerRace, playerClass) {
list[playerFirstName] = {
playerFirstName: playerFirstName,
playerLastName: playerLastName,
playerRace: playerRace,
playerClass: [playerClass]
};
}
//VIEW FUNCTION
var viewSheet = function(name, checkparam) {
for(var key in checkparam) {
if(checkparam[key].playerFirstName.toLowerCase() === name.toLowerCase()) {
for(var stat in checkparam[key])
{
console.log(checkparam[key].stat);
}
//return checkparam[key];
}
}
};
//--MAIN //
//-init
var adding = true;
//-run
//Add characters to party.
console.log("Let's add some people to a list.")
while (adding){
add(rlprompt.question("Please enter a first name: "), fverparty, rlprompt.question("Please enter a last name: "), rlprompt.question("Please enter a race: "), rlprompt.question("Please enter a class: "));
if (rlprompt.question("Any key to continue, (q/Q) to quit.").toLowerCase() == "q") {
adding = false;
}
}
//List the party members
list(fverparty);
//View character sheets
viewSheet(rlprompt.question("Enter a name to view their character sheet: "), fverparty);
像使用键一样使用stat:
checkparam[key][stat]
这样就行了。。。我觉得自己好笨。非常感谢@PatrickEvans。接下来的问题是,在for循环的上下文中,checkparam.key.stat与checkparam[key][stat]之间有什么区别?IE我可以console.log第一个版本,但如果只是空的,我只能console.log第二个版本,而不是第一个版本,如果在for循环中?如果您有var key=“foo”,stat=“bar”
,并且您执行checkparam[key][stat]
,它实际上会查找checkparam.foo.bar
。然而,checkparam.key.stat
将始终只查找checkparam.key.stat
@laggingReflection,我明白了,所以[]表示需要查找与key和stat相关的值,而foo.bar.stuff总是按字面意思取?是的。更多信息:
//--MODULES
//Readline Sync for CLI prompting
var rlprompt = require('readline-sync');
//--DECLARE OBJECTS //
var fverparty = new Object();
//--DEFINE FUNCS //
//LIST FUNCTION
var list = function (param) {
console.log("Party members: ")
for (var key in param) {
console.log(param[key].playerFirstName);
}
}
//ADD FUNCTION
var add = function (playerFirstName, list, playerLastName, playerRace, playerClass) {
list[playerFirstName] = {
playerFirstName: playerFirstName,
playerLastName: playerLastName,
playerRace: playerRace,
playerClass: [playerClass]
};
}
//VIEW FUNCTION
var viewSheet = function(name, checkparam) {
for(var key in checkparam) {
if(checkparam[key].playerFirstName.toLowerCase() === name.toLowerCase()) {
for(var stat in checkparam[key])
{
console.log(checkparam[key].stat);
}
//return checkparam[key];
}
}
};
//--MAIN //
//-init
var adding = true;
//-run
//Add characters to party.
console.log("Let's add some people to a list.")
while (adding){
add(rlprompt.question("Please enter a first name: "), fverparty, rlprompt.question("Please enter a last name: "), rlprompt.question("Please enter a race: "), rlprompt.question("Please enter a class: "));
if (rlprompt.question("Any key to continue, (q/Q) to quit.").toLowerCase() == "q") {
adding = false;
}
}
//List the party members
list(fverparty);
//View character sheets
viewSheet(rlprompt.question("Enter a name to view their character sheet: "), fverparty);