Оператор переключения для сопоставления строк в JavaScript

Как я пишу swtich для следующего условного выражения?

Если URL содержит "нечто", то настройки base_url являются "панелью".

Следующее достигает требуемого эффекта, но у меня есть чувство, что это было бы более управляемо в переключателе:

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/"
    };
}
179
задан ST3 8 October 2013 в 07:00
поделиться

2 ответа

Вы не можете сделать это в переключателе , если не выполните полное сопоставление строк; это выполняет сопоставление подстроки . (Это не совсем правда, как указывает Шон в комментариях. См. Примечание в конце.)

Если вам нравится, что ваше регулярное выражение вверху удаляет все что вы не хотите сравнивать в своем совпадении, вам не нужно совпадение подстроки, и вы могли бы сделать:

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

... но опять же, это работает, только если это полная строка, которую вы ' повторное соответствие. Это не сработает, если base_url_string будет, скажем, «yyy.xxx.local», тогда как ваш текущий код будет соответствовать таковому в ветке «xxx.local».


Обновление : Хорошо, технически вы можете использовать переключатель для сопоставления подстроки, но я бы не рекомендовал его в большинстве ситуаций. Вот как ( живой пример ):

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 , будет тем, которое будет использоваться.

336
ответ дан 23 November 2019 в 06:15
поделиться

Просто используйте свойство location.host

switch (location.host) {
    case "xxx.local":
        settings = ...
        break;
    case "xxx.dev.yyy.com":
        settings = ...
        break;
}
35
ответ дан 23 November 2019 в 06:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: