JavaScript中字符串匹配的switch语句

新手上路,请多包涵

如何为以下条件编写开关?

如果 url 包含“foo”,则 settings.base_url 为“bar”。

以下是实现所需的效果,但我觉得这在开关中会更易于管理:

 var doc_location = document.location.href;
 var url_strip = new RegExp("http:\/\/.*\/");
 var base_url = url_strip.exec(doc_location)
 var base_url_string = base_url[0];

 //BASE URL CASES

 // LOCAL
 if (base_url_string.indexOf('xxx.local') > -1) {
 settings = {
 "base_url" : "http://xxx.local/"
 };
 }

 // DEV
 if (base_url_string.indexOf('xxx.dev.yyy.com') > -1) {
 settings = {
 "base_url" : "http://xxx.dev.yyy.com/xxx/"
 };
 }

原文由 Dr. Frankenstein 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

除非您进行 完整 的字符串匹配,否则您无法在 switch 中执行此操作;那是在做 子字符串 匹配。 (这并不 完全 正确,正如肖恩在评论中指出的那样。见最后的注释。)

如果您很高兴顶部的正则表达式删除了您不想在匹配中比较的所有内容,那么您不需要子字符串匹配,并且可以这样做:

 switch (base_url_string) {
 case "xxx.local":
 // Blah
 break;
 case "xxx.dev.yyy.com":
 // Blah
 break;
 }

…但同样,只有当这是您匹配的 完整 字符串时才有效。如果 base_url_string 是“yyy.xxx.local”,而您当前的代码将与“xxx.local”分支中的代码匹配,它将失败。


更新:好的,所以从技术上讲,您 可以 使用 switch 进行子字符串匹配,但在大多数情况下我不推荐它。以下是方法( 现场示例):

 function test(str) {
 switch (true) {
 case /xyz/.test(str):
 display("• Matched 'xyz' test");
 break;
 case /test/.test(str):
 display("• Matched 'test' test");
 break;
 case /ing/.test(str):
 display("• Matched 'ing' test");
 break;
 default:
 display("• Didn't match any test");
 break;
 }
 }

这是因为 JavaScript switch 语句的工作 方式,特别是两个关键方面:首先,按照 源文本 顺序考虑 case,其次,选择器 _表达式_(关键字 case 之后的位)是被评估为case 被评估(不是像其他一些语言中的常量)。因此,由于我们的测试表达式为 true ,因此第一个结果为 truecase 表达式将被使用。

原文由 T.J. Crowder 发布,翻译遵循 CC BY-SA 3.0 许可协议

您还可以像这样使用默认情况:

 switch (name) {
 case 't':
 return filter.getType();
 case 'c':
 return (filter.getCategory());
 default:
 if (name.startsWith('f-')) {
 return filter.getFeatures({type: name})
 }
 }

原文由 Omar Dulaimi 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题