【问题标题】:Js switch statement constructionjs switch语句构造
【发布时间】:2019-07-22 17:45:18
【问题描述】:

我正在使用应用程序脚本/ES5。我有:

function returnText(message) {
  switch(message.indexOf(mykey)!== -1) {
  case true:
    var mykey = 'ziptest'  
    break;
  case true:
    var mykey = 'setnum' 
    break;
  default:
      console.log('default');
  }
}

function returnText1() {
  returnText('ziptest 19886991201')
}

returnText1();

它默认为默认选项。我该如何解决这个问题,以便它选择以下选项:

  var mykey = 'ziptest' 

【问题讨论】:

  • 为什么case true有两次?
  • 对布尔条件使用 if-else 条件。
  • 这不是你使用switch的方式。
  • 您在设置之前测试mykey 的值。所以undefined 显然不会出现在message 中。
  • 你怎么会有 5 或 6 个布尔选项??

标签: javascript google-apps-script


【解决方案1】:

您误解了 switch 语句的工作原理。 JavaScript 函数中的代码大部分是按部就班的,从头到尾的顺序。 switch () 中的条件在到达代码点时被评估一次

如果您想在message 中检查两个不同的字符串,尽管您可以使用switch,但这样做既不合适又令人困惑。而是使用if/else if/else

function returnText(message) {
    if (message.indexOf("ziptest")!== -1) {
        return "ziptest";
    } else if (message.indexOf("setnum") !== -1) {
        return "setnum";
    } else {
        return "default";
    }
}

(由于每个分支returns,你实际上并不需要else,但是......)


在你说过的评论中:

目前我只有 3 个选项,但我以后可能想再添加 5-6 个

在这种情况下,请使用循环。如果您可以使用 ES2015+ 功能,我会使用find

const strings = ["ziptest", "setnum", /*...*/];
function returnText(message) {
    return strings.find(str => message.indexOf(str) !== -1) || "default";
}

find 返回第一个回调返回真值(并停止循环)的条目,或者undefined 如果它用完条目而回调返回真值。因此,使用上述内容,我们检查每个 str 返回的 true 是否字符串存在于 message 中。如果find 返回undefined|| "default" 就会启动并提供默认字符串。

但既然你不能,你可以使用some作为TheMaster shows,或者只是一个简单的循环:

var strings = ["ziptest", "setnum", /*...*/];
function returnText(message) {
    for (var i = 0; i < strings.length; ++i) {
        var str = strings[i];
        if (message.indexOf(str) !== -1) {
            return str;
        }
    }
    return "default";
}

旁注:我看到你已经标记了这个,所以你可能被.indexOf(str) !== -1 卡住了。但我听说他们正在更新它,所以你可能现在有.includes(str)

【讨论】:

    【解决方案2】:

    如果你有很多键,你应该使用数组。

    var myKeys = ['ziptest', 'setnum'];
    function returnText(message) {
      var selectKey;
      myKeys.some(function(key){
    if(message.indexOf(key) !== -1) {
      selectKey = key;
      return true;
    }
      })
      return selectKey;
      }
    
    function returnText1() {
      return returnText('ziptest 19886991201')
    }
    
    console.log(returnText1());

    【讨论】:

    • 只是 FWIW,有一个内置函数可以执行您上面的 some 构造的操作:find
    • @T.J.Crowder 是的。我在你的回答中看到了。但在应用程序脚本中尚不支持。从 mdn 方法列表中,of、from、find、findIndex、fill、includes、entry、copyWithin、flat、flatMap、keys、values 尚不支持。 AFAIK,其余的都完全支持。箭头函数也不支持。
    • 我一直忘记find 是 ES2015,而不是 ES5。 :-)
    【解决方案3】:

    如果你真的想使用switch,那么你可以这样做。

    function returnText(message) {
      switch (true) {
        case message.indexOf('ziptest') > -1:
          console.log('ziptest');
          break;
        case message.indexOf('setnum') > -1:
          console.log('setnum');
          break;
        default:
          console.log('default');
      }
    }
    
    function returnText1() {
      returnText('ziptest 19886991201')
    }
    
    returnText1();

    【讨论】:

    • 当然没有充分的理由。只是为了展示如何正确使用不正确的工具。
    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 2016-06-05
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多