切换组合大小写字符串regex和数字

Switch combining cases string regex and number

本文关键字:regex 数字 字符串 大小写 组合      更新时间:2023-09-26

有没有一种方法可以在一个Javascript switch语句中创建多个案例?

在我的代码中,我通过jQuery接收一个字段的值。

是否可能一种情况下检查字符串regex,另一种情况检查相同变量的编号?

我的思路是:

var field = $(this).val();
var msg;
switch (field) 
{
    case field.test('Yes'):
     msg = "FOO'n";
     break;
    case 10: 
     msg = "BAR'n";
     break;
}

尽管我在这里看到了:JavaScript 中用于字符串匹配的Switch语句

在字符串上使用switch的方法是向switch语句发送一个"true"值。

实现这一目标的最简洁(也是最正确!)的方法是什么?

好吧,在我的代码之上编译两个答案,这两个答案都是有效的,也是最优雅的IMO是:

var fieldVal = $(this).val();
var msg;
switch (true) 
{
  case /Yes/.test(fieldVal):
      msg = "FOO";
      break;
  case fieldVal > 10 :
      msg = "BAR";
      break;
}

这是作为单独的if语句工作的,因为我们正在评估情况是否返回true,但以一种更清晰、更简洁的方式,可以让我们选择在一个开关中添加完全不同的测试语句。

它之所以有效,可能是因为所计算的case表达式被解释为true或false值,然后对照main进行检查-开关(真)

与switch表达式相比,用例不需要单个值,但可以放置多个用例来执行相同的代码:

switch (field) {
    case 'Yes':
    case 'yes':
    case 'YES':
        msg = "FOO'n";
        break;
    case 10: 
        msg = "BAR'n";
        break;
}

但为了使用测试作为案例,你可以将true传递给switch(我在一些开源项目中发现了这个技巧):

switch (true) {
    case field.test('Yes'):
        msg = "FOO'n";
        break;
    case field == 10: 
        msg = "BAR'n";
        break;
}

但这与if/else 相同

注意:您使用test()不正确,它是正则表达式对象的方法,因此您需要/Yes/.test(field)而不是field.test('Yes')。无论如何

如果你只有两种情况,那么我会使用if/else/else if结构:

var field = $(this).val();
var msg;
if(/Yes/.test(field)) {
     msg = "FOO'n";
} else if (field === 10) { 
     msg = "BAR'n";
}

如果你需要添加额外的案例,我只需要在末尾添加额外的if else {}分支。

如果你有几个特定的数字案例,你可以考虑把它们放在switch中,最后在default中进行regex测试:

switch (field) {
    case 10: 
        msg = "BAR'n";
        break;
    case 30:
        msg = "whatever'n";
        break;
    case 50:
        msg = "hi'n";
        break;
    default:
        if (/Yes/.test(field)) {
           msg = "FOO'n";
        else if (/No|N|False|/i.test(field)) {
           msg = "blah'n";
        }
        break;
}

你在问题中提到的switch (true)选项实际上只是if/else/else if的一个更混乱的版本,所以它实际上没有意义,除非你有一些失败的情况:

switch(true)
    case /Yes/.test(field):
    case /Y/.text(field):
    case /Whatever/.text(field):
        msg = "FOO'n";
        break;
    case field == 10: 
        msg = "BAR'n";
        break;
}

即使这样,具有多个条件的if||也可以说与适当的换行符一样整洁,并且将多个正则表达式组合为一个正则表达式可能要整洁得多。