簡體   English   中英

在JavaScript中將變量的值調用為對象的屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM