Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript(node.js):遍历嵌套对象并获得未定义_Javascript_Node.js_Loops_Object_Nested - Fatal编程技术网

Javascript(node.js):遍历嵌套对象并获得未定义

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正确地指向了较低嵌套对象中的属性键,因为

我使用命令行上的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哈希一样,因此我一直认为可以像在这些语言中一样嵌套数据

下面是上下文的全部代码

//--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);