是否可以在 switch 语句中使用 .contains() ?

问题描述 投票:0回答:3

这只是我正在尝试做的一个简单示例:

switch (window.location.href.contains('')) {
    case "google":
        searchWithGoogle();
        break;
    case "yahoo":
        searchWithYahoo();
        break;
    default:
        console.log("no search engine found");
}

如果不可能/不可行,什么是更好的选择?

解决方案:

阅读了一些回复后,我发现以下是一个简单的解决方案。

function winLocation(term) {
    return window.location.href.contains(term);
}
switch (true) {
    case winLocation("google"):
        searchWithGoogle();
        break;
    case winLocation("yahoo"):
        searchWithYahoo();
        break;
    default:
        console.log("no search engine found");
}
javascript switch-statement contains
3个回答
41
投票

“是”,但它不会达到您的预期。

用于开关的表达式被计算 once - 在这种情况下

contains
计算结果为真/假(例如
switch(true)
switch(false)
) ,不是可以在大小写中匹配的字符串。

因此,上述方法行不通。除非这个模式更大/可扩展,否则只需使用简单的 if/else-if 语句。

var loc = ..
if (loc.contains("google")) {
  ..
} else if (loc.contains("yahoo")) {
  ..
} else {
  ..
}

但是,考虑是否有一个

classify
函数返回“google”或“yahoo”等,也许使用上面的条件。然后就可以这样使用,但在这种情况下可能有点矫枉过正。

switch (classify(loc)) {
   case "google": ..
   case "yahoo": ..
   ..
}

虽然上面讨论了 JavaScript 中的此类问题,但 Ruby 和 Scala(以及可能的其他语言)提供了处理一些更“高级切换”用法的机制。


25
投票

另一种实现可能是这样的。内容不多,但读起来比 switch(true) 好……

const href = window.location.href;
const findTerm = (term) => {
  if (href.includes(term)){
    return href;
  }
};

switch (href) {
  case findTerm('google'):
      searchWithGoogle();
      break;
  case findTerm('yahoo'):
      searchWithYahoo();
      break;
  default:
      console.log('No search engine found');
};

0
投票

尝试 tldts 库:

npm i tldts
import { parse } from "tldts";

const domainWithoutSuffix = parse(href).domainWithoutSuffix;
switch (domainWithoutSuffix) {
  case "facebook":
    // do stuff
  case "github":
    // do stuff
  case "youtube":
    // do stuff
  default:
    // do stuff
}
© www.soinside.com 2019 - 2024. All rights reserved.