切换组合案例字符串正则表达式和数字

时间:2013-08-14 10:52:30

标签: javascript jquery regex switch-statement

有没有办法在单个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语句发送为“true”值。

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

3 个答案:

答案 0 :(得分:10)

好的,在我的代码上方编译两个答案,并且(在我看来)最优雅的是:

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检查 -     开关(真)

答案 1 :(得分:0)

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

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

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

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

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

但这与if/else

相同

答案 2 :(得分: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 {}分支。

如果您有几个特定的​​数字案例,可以考虑将它们放在switch中,最后在default中使用正则表达式测试:

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加上||连接的多个条件可以说与适当的新行一样整洁,并且将多个正则表达式合并为一个可能更加整洁。