web-dev-qa-db-ja.com

switchステートメントで.contains()を使用することは可能ですか?

これは私がやろうとしていることの簡単な例です:

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");
}
21
RayB

「はい」、しかしそれはあなたが期待することをしません。

スイッチに使用される式が評価されますonce-この場合、containsは結果としてtrue/falseに評価されます(例:switch(true)またはswitch(false))、ケースで照合できる文字列ではありません。

そのため、上記のアプローチは機能しません。このパターンがはるかに大きく/拡張可能でない限り、単純なif/else-ifステートメントを使用してください。

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

ただし、「google」や「yahoo」などを返すclassify関数が、おそらく上記の条件を使用していたかどうかを検討してください。その後、そのまま使用できますが、この場合はやり過ぎです。

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

上記はJavaScriptでの説明ですが、RubyおよびScala(および他の可能性が高い))は、「高度なスイッチ」の使用を処理するメカニズムを提供します。

16
user2864740

別の実装はこれかもしれません。それほど多くはありませんが、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');
};
2
TimT