【问题标题】:Javascript switch statement with wildcard?带有通配符的Javascript switch语句?
【发布时间】:2011-01-17 07:06:12
【问题描述】:

如果我的 javascript ajaxes 到我的服务器并以 [49] 的纯文本格式返回一个 ID 为 49 有没有一种方法可以让我做这样的事情......(我已经测试过并且不起作用)

switch(data)
{
    case '[*]':
        (..etc.)
    break;
}

通配符是*,我想确保它包含在两个方括号内?

因为我需要检查是否没有返回像 error 这样的另一个词,并且我将 default 保留为意外错误,有什么想法吗? :) 谢谢!

【问题讨论】:

  • 考虑到问题的标题,@Tracker1 的答案应该是正确的。

标签: javascript jquery wildcard switch-statement


【解决方案1】:

您可以尝试使用if elseregex 来匹配通配符模式。

假设data = "[49]"; 或括号内的任何数字。

if(/\[\d+\]/.test(data)){
    //do something
}else{
    //default
}

【讨论】:

  • 我只是将数据保存到了一个 var 中,如果正确,则将数据设置为其他内容;)干杯
【解决方案2】:

简答:不,switch/case 不能处理通配符。

您可能应该在进入交换机之前进行一些预处理/完整性检查,或者干脆完全放弃它,因为它更适合特定情况,而不是处理简化的数据。 Regexp 将在这里为您提供更好的服务。

【讨论】:

  • 是的,它可以,请参阅我之前的帖子...实际上它可以为开关处理 true,然后评估每个案例。它不必像其他语言中的 case 语句那样是固定值。
  • 哇!不错的一个,不知道。
【解决方案3】:

您可以显式地打开 true,这将对每个 case 语句进行评估。

switch (true) {
    case ((/^\[\d+\]$/).test(data)):
       //matches data;
       break;
    case (data == "something else"):
       //...
       break;
    default:
       //...
}

但是,如果您的案例少于 4-5 个,最好使用 if/else if/else if/else 块。

if ((/^\[\d+\]$/).test(data)) {
       //matches data;
} else if (data == "something else") {
       //...
} else {
       //...
}

我通常在服务/休息调用的响应方法中进行一些错误捕获,以便在出现错误时几乎总是返回带有错误属性的正确 json。

try {
  if (response.responseText.indexOf("<html") >= 0) { 
    throw response.responseText;
  }

  var data = JSON.parse(response.responseText);
  if (data.error) 
    throw data.error;

  //handle response data object.
  if ((/^\[\d+\]$/).test(data)) {
    //matches data;
  } else if (data == "something else") {
    //...
  } else {
    //...
  }
} catch(err) {
  if (err && err.message) {
      //use err.message
  } else if (err && err.toString().indexOf("<html") >= 0) {
      //handle error text
  }
}

【讨论】:

    【解决方案4】:

    您可以创建一个模式列表和相关回调,并执行一个简单的循环并检查匹配项。例如:

        var patterns = [];
    
        function myCallback(){ document.write('myCallback!'); }
        function myOtherCallback(){ document.write('myOtherCallback!'); }
        function myLastCallback(){ document.write('You will never see me!'); }
    
        patterns.push({'pattern':new RegExp(/\[.+\]/),'callback': myCallback});
        patterns.push({'pattern':new RegExp(/.+/),'callback':myOtherCallback});
        patterns.push({'pattern':new RegExp(/A-Z{3}/),'callback':myLastCallback});
    
        var f = "[49]";
        for(var i=0;i<patterns.length;i++){
            if(patterns[i].pattern.test(f)){
                patterns[i].callback();
            }
        }
    

    输出如下:

    myCallback!myOtherCallback!
    

    【讨论】:

      猜你喜欢
      • 2020-12-06
      • 2011-02-23
      • 1970-01-01
      • 2016-12-12
      • 1970-01-01
      • 1970-01-01
      • 2015-12-24
      • 1970-01-01
      • 2017-03-14
      相关资源
      最近更新 更多