0

Можно ли использовать .contains() в операторе switch?

1

Я столкнулся с проблемой при попытке использовать оператор switch для обработки URL-адреса, чтобы определить, какой поисковой системой воспользоваться. Вот простой пример того, что я пытаюсь сделать:

switch (window.location.href.contains('')) {
    case "google":
        searchWithGoogle();
        break;
    case "yahoo":
        searchWithYahoo();
        break;
    default:
        console.log("поисковая система не найдена");
}

Проблема в том, что метод contains для строки в JavaScript не существует, и я не уверен, как правильно реализовать проверку содержимого URL. Если это невозможно или нецелесообразно, какой был бы лучший альтернативный подход?

Я нашел одно из простых решений после того, как прочитал некоторые ответы:

function winLocation(term) {
    return window.location.href.contains(term);
}
switch (true) {
    case winLocation("google"):
        searchWithGoogle();
        break;
    case winLocation("yahoo"):
        searchWithYahoo();
        break;
    default:
        console.log("поисковая система не найдена");
}

Пожалуйста, подскажите, правильно ли я действую или есть более эффективные методы для решения данной задачи.

2 ответ(ов)

0

Да, но это не сработает так, как вы ожидаете.

Выражение, используемое для switch, вычисляется один раз — в вашем случае contains возвращает true или false (например, switch(true) или switch(false)), а не строку, которую можно сопоставить с case.

Таким образом, вышеописанный подход не сработает. Если этот паттерн не слишком велик и не требует расширения, просто используйте простые операторы if/else-if:

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

Однако рассмотрим ситуацию, когда есть функция classify, которая возвращает "google" или "yahoo" и т. д., возможно, используя условные конструкции, как показано выше. В этом случае можно использовать switch, но, вероятно, это излишне в данной ситуации:

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

Хотя вышеобсуждаемое относится к JavaScript, Ruby и Scala (а также, вероятно, другие языки) предлагают механизмы для обработки более "расширенного" использования switch.

0

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

const href = window.location.href;
const findTerm = (term) => {
  if (href.includes(term)) {
    return href; // Возвращает href, если он содержит искомый термин
  }
  return null; // Возвращает null, если термин не найден
};

if (findTerm('google')) {
  searchWithGoogle();
} else if (findTerm('yahoo')) {
  searchWithYahoo();
} else {
  console.log('Поисковая система не найдена');
}

В этой версии используется последовательная проверка с помощью if-else, что делает код более понятным и читаемым.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь