[英]Calling the value of a variable as a property of an object in JavaScript
我正在為此應用程序編寫命令處理程序,該程序使用嵌套的JSON鍵/值列表作為執行命令的目錄。 (文件的結構仍在進行中):
{
"commands": {
"category1": {
"command1_c1": {
"alias": ["c1c1alias1", "c1c1alias2", "c1c1alias3", "c1c1alias4"]
},
"command2_c1": {
"alias": ["c1c2alias1", "c1c2alias2"]
},
"command3_c1": {
"alias": ["c1c3alias1", "c1c3alias2"]
}
},
"category2": {
"command1_c2": {
"alias": ["c2c1alias1", "c2c1alias2"]
},
"command2_c2": {
"alias": ["c2c2alias1"]
}
}
}
}
我的JavaScript文件中“需要”此JSON文件:
const jsonCommands = require("./commands/commands.json");
我寫了這段代碼,應該像這樣遍歷每個級別,然后根據用戶的輸入找到一個命令:
for (var listedCategory in jsonCommands.commands) {
console.log(`listedCategory: ${listedCategory}`);
for (var listedCommand in jsonCommands.commands.listedCategory) {
console.log(`listedCommand: ${listedCommand}`);
if (listedCommand === userCommand) {
console.log(`success in finding command ${userCommand}`);
}
}
}
上面的代碼在第二個for-in
循環中不記錄任何內容。 上面編寫的代碼的返回結果是這樣的(並且不會引發錯誤):
listedCategory: lookup
listedCategory: other
這是該代碼的另一個版本,其功能相似,但也訪問alias
數組。 我懷疑它現在是否會返回任何數組值:
Object.keys(jsonCommands).forEach(category => {
console.log(`Category: ${category}`);
Object.keys(jsonCommands.category).forEach(command => {
console.log(`Command: ${command}`);
if (command === userCommand) {
console.log(`A command was recognized: \`${userCommand}\``);
} else {
Object.keys(jsonCommands.category.command).forEach(aliasCommand => {
console.log(`aliasCommand: ${aliasCommand}`);
if (aliasCommand === userCommand) {
console.log(`A command alias was recognized: \`${userCommand}\``);
}
});
}
});
});
上面的代碼也不起作用。 這是引發的錯誤:
Object.keys(jsonCommands.category).forEach(command => {
TypeError: Cannot convert undefined or null to object
現在,我在這里看到兩個問題,每個示例一個。 (盡管我主要發布了第二個示例,以顯示我還嘗試了其他方法。)第一個代碼示例中的問題是,它可能試圖將變量名作為JSON鍵而不是在JSON中分配的變量名來訪問。回調,例如語句jsonCommands.commands.listedCategory
,使返回值不確定,這就是為什么它不會迭代的原因。
我不確定第二個代碼示例中發生了什么。 我懷疑引發錯誤的原因是相似的-告訴Object.keys訪問未定義的值。
我敢肯定,如果該錯誤已修復,第一個解決方案將可以正常工作。 我將如何使在回調函數上聲明的listedCategory
變量的值用作JSON對象的屬性?
抱歉,如果這是一個重復的問題。
TL:DR;
要使用變量訪問屬性時,需要使用[]
let jsonCommands = {"commands": {"category1": {"command1_c1": {"alias": ["c1c1alias1", "c1c1alias2", "c1c1alias3", "c1c1alias4"]},"command2_c1": {"alias": ["c1c2alias1", "c1c2alias2"]},"command3_c1": {"alias": ["c1c3alias1", "c1c3alias2"]}},"category2": {"command1_c2": {"alias": ["c2c1alias1", "c2c1alias2"]},"command2_c2": {"alias": ["c2c2alias1"]}}}} let userCommand = 'command2_c2' for (var listedCategory in jsonCommands.commands) { console.log(`listedCategory: ${listedCategory}`); for (var listedCommand in jsonCommands.commands[listedCategory]) { console.log(`listedCommand: ${listedCommand}`); if (listedCommand === userCommand) { console.log(`success in finding command ${userCommand}`); } } }
您應該這樣編寫第一段代碼:
let userCommand = 'command3_c1'
for (const listedCategory in jsonCommands.commands) {
console.log(`listedCategory: ${listedCategory}`);
for (const listedCommand in jsonCommands.commands[listedCategory]) {
console.log(`listedCommand: ${listedCommand}`);
if (listedCommand === userCommand) {
console.log(`success in finding command ${userCommand}`);
}
}
}```
And the out is:
```Category: commands
Command: category1
aliasCommand: command1_c1
aliasCommand: command2_c1
aliasCommand: command3_c1
A command alias was recognized: `command3_c1`
Command: category2
aliasCommand: command1_c2
aliasCommand: command2_c2
第二:
let userCommand = 'command3_c1'
Object.keys(jsonCommands).forEach(category => {
console.log(`Category: ${category}`)
Object.keys(jsonCommands[category]).forEach(command => {
console.log(`Command: ${command}`)
if (command === userCommand) {
console.log(`A command was recognized: \`${userCommand}\``)
} else {
Object.keys(jsonCommands[category][command]).forEach(aliasCommand => {
console.log(`aliasCommand: ${aliasCommand}`)
if (aliasCommand === userCommand) {
console.log(`A command alias was recognized: \`${userCommand}\``)
}
})
}
})
})
結果是:
Command: category1
aliasCommand: command1_c1
aliasCommand: command2_c1
aliasCommand: command3_c1
A command alias was recognized: `command3_c1`
Command: category2
aliasCommand: command1_c2
aliasCommand: command2_c2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.