5

有没有办法在单个 Javascript switch 语句中创建多个案例?

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

是否有可能一种情况检查字符串正则表达式,另一种情况检查相同变量的数量?

我的思路是:

var field = $(this).val();
var msg;
switch (field) 
{
    case field.test('Yes'):

     msg = "FOO\n";
     break;

    case 10: 
     msg = "BAR\n";
     break;
}

虽然我在这里看到:Switch statement for string matching in JavaScript

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

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

4

3 回答 3

10

好的,在我的代码上方编译两个答案,这是最优雅的 IMO 是:

var fieldVal = $(this).val();

var msg;

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

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

它起作用的原因可能是评估的 case 表达式被解释为 true 或 false 值,然后检查 main - switch(true)

于 2013-08-14T12:23:39.367 回答
0

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

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

    case 10: 
        msg = "BAR\n";
        break;
}

但是为了使用测试作为案例,你可以通过 true 来切换(我在一些开源项目中发现了这个技巧):

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

但这与if/else

于 2013-08-14T11:07:42.217 回答
0

注意:你使用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 {}在最后添加额外的分支。

如果您有几个特定的​​数字案例,您可以考虑将它们放在 aswitch中,并将正则表达式测试放在 adefault中:

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)您在问题中提到的选项实际上只是 an 的更混乱版本,因此除非您有一些失败的案例,否则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具有多个条件的连接||可以说与适当的换行符一样整洁,并且将多个正则表达式组合成一个可能会更整洁。

于 2013-08-14T11:12:59.053 回答