JavaScript 中 if(input.startsWith("string")) { ... } 的切换大小写版本
Switch case version of if(input.startsWith("string")) { ... } in JavaScript
上下文: 我正在制作一个具有命令处理程序的游戏。在那个命令处理程序中,我正在尝试优化一段代码。
我正在尝试制作一个 switch-case 语句,它允许我做与下面显示的完全相同的事情
input.startsWith('echo') ? ( History.add(input), commands.echo(input) )
: ( input.startsWith('history') ? (History.add(input), commands.history(input))
: input.startsWith("new") ? (History.add(input), commands.new(input) )
: input.startsWith('theme') ? (History.add(input), commands.theme(input))
: (developerMode == true && input == "test") ? (History.add(input), commands.test())
: input.startsWith("cd") ? (History.add(input), commands.cd(input))
: input.startsWith("find") ? (History.add(input), commands.find(input, type, title))
: (History.add(input), utils.message({ user: '$', command: input }, ` - bash: ${input}: command not found `, 'error')))
简化版:
if (input.startsWith('echo')) {
History.add(input)
commands.echo(input);
} else if (input.startsWith("history"))
History.add(input)
commands.history(input);
} else if (input.startsWith("new")) {
History.add(input)
commands.new(input);
} else if (input.startsWith('theme')) {
History.add(input)
commands.theme(input);
} else if (developerMode == true && input == "test") {
History.add(input)
commands.test()
} else if (input.startsWith("cd")) {
History.add(input)
commands.cd(input)
} else if (input.startsWith("find")) {
History.add(input)
commands.find(input, type, title)
} else {
History.add(input)
utils.message({ user: '$', command: input }, ` - bash: ${input}: command not found `, 'error');
}
您的代码中存在一些冗余。首先,您可以通过对 commands
的键进行测试来检查您的命令是否是有效命令(您应该尝试获取不带 string#startWith 的第一个命令参数)。
如评论中所述,您无需将 else-if 更改为 switch。没有收获。但是,在这两种情况下,您都必须添加代码来处理您的命令,既要填充命令对象又要解析用户输入。
要获得一定的灵活性和可重用性,最好的办法是以相同的方式解析和执行所有命令。
假设您的命令由空格分隔,还有一个方法可以走:
const [ cmd, ...args ] = input.split(' ');//at index 0, you get your command, in args, you get your command args. It's called array destructuring
//Note that you may need a more complexe way to parse your command, but you should get the idea.
//Since you do it every time, you don't have to repeat it
History.push(input);
if(cmd in commands) commands[cmd](input, ...args);
else utils.message(
{ user: '$', command: input },
` - bash: ${input}: command not found `, 'error'
);
上下文: 我正在制作一个具有命令处理程序的游戏。在那个命令处理程序中,我正在尝试优化一段代码。
我正在尝试制作一个 switch-case 语句,它允许我做与下面显示的完全相同的事情
input.startsWith('echo') ? ( History.add(input), commands.echo(input) )
: ( input.startsWith('history') ? (History.add(input), commands.history(input))
: input.startsWith("new") ? (History.add(input), commands.new(input) )
: input.startsWith('theme') ? (History.add(input), commands.theme(input))
: (developerMode == true && input == "test") ? (History.add(input), commands.test())
: input.startsWith("cd") ? (History.add(input), commands.cd(input))
: input.startsWith("find") ? (History.add(input), commands.find(input, type, title))
: (History.add(input), utils.message({ user: '$', command: input }, ` - bash: ${input}: command not found `, 'error')))
简化版:
if (input.startsWith('echo')) {
History.add(input)
commands.echo(input);
} else if (input.startsWith("history"))
History.add(input)
commands.history(input);
} else if (input.startsWith("new")) {
History.add(input)
commands.new(input);
} else if (input.startsWith('theme')) {
History.add(input)
commands.theme(input);
} else if (developerMode == true && input == "test") {
History.add(input)
commands.test()
} else if (input.startsWith("cd")) {
History.add(input)
commands.cd(input)
} else if (input.startsWith("find")) {
History.add(input)
commands.find(input, type, title)
} else {
History.add(input)
utils.message({ user: '$', command: input }, ` - bash: ${input}: command not found `, 'error');
}
您的代码中存在一些冗余。首先,您可以通过对 commands
的键进行测试来检查您的命令是否是有效命令(您应该尝试获取不带 string#startWith 的第一个命令参数)。
如评论中所述,您无需将 else-if 更改为 switch。没有收获。但是,在这两种情况下,您都必须添加代码来处理您的命令,既要填充命令对象又要解析用户输入。
要获得一定的灵活性和可重用性,最好的办法是以相同的方式解析和执行所有命令。
假设您的命令由空格分隔,还有一个方法可以走:
const [ cmd, ...args ] = input.split(' ');//at index 0, you get your command, in args, you get your command args. It's called array destructuring
//Note that you may need a more complexe way to parse your command, but you should get the idea.
//Since you do it every time, you don't have to repeat it
History.push(input);
if(cmd in commands) commands[cmd](input, ...args);
else utils.message(
{ user: '$', command: input },
` - bash: ${input}: command not found `, 'error'
);