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