このアプリのコマンドハンドラーを作成しています。このハンドラーは、ネストされた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"]
}
}
}
}
このJSONファイルは私のJavaScriptファイルで「必須」です:
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}`);
}
}
}
上記のこのコードは、2番目の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
ここで、各例に1つずつ、合計2つの問題があります。(ただし、他に何を試したかを示すために、主に2番目の例を投稿しました。)最初のコード例の問題は、変数名に割り当てられている変数名ではなく、JSONキーとして変数名にアクセスしようとしている可能性があることです。ステートメントなどのコールバックによりjsonCommands.commands.listedCategory
、戻り値が未定義になります。そのため、反復されません。
2番目のコード例で何が起こっているのかわかりません。スローされたエラーの理由は似ていると思いますが、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}`);
}
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加