1. ホーム
  2. ジャバスクリプト

[解決済み】JavaScriptの文字列マッチングのためのSwitch文

2022-04-18 07:19:19

質問

以下の条件に対する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/"
    };
}

解決方法は?

にはできません。 switch をしているのでなければ フル 文字列のマッチング。 部分文字列 マッチングを行います。 (これは かなり コメントでSeanが指摘しているように、本当です。末尾の注を参照)

もし、一番上の正規表現がマッチの中で比較したくないものをすべて取り除いていることに満足しているなら、部分文字列マッチは必要なく、できるはずです。

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 ステートメントが動作します。 特に、2つの重要な点があります。第一に、ケースは ソーステキスト の順番に並べること、そして、セレクタ式(キーワード case ) は は、そのケースが評価されるときに評価されます(他のいくつかの言語のように定数ではありません)。ですから、私たちのテスト式は true の場合、最初の case になる式は true が使われます。