Можно ли использовать .contains() в операторе switch?
Я столкнулся с проблемой при попытке использовать оператор 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 ответ(ов)
Да, но это не сработает так, как вы ожидаете.
Выражение, используемое для 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
.
Альтернативная реализация может выглядеть следующим образом. В ней не так много изменений, но читается она лучше, чем использование 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
, что делает код более понятным и читаемым.
Как проверить, содержит ли строка подстроку?
Как перенаправить на другую веб-страницу?
Где найти документацию по форматированию даты в JavaScript?
Как проверить, содержит ли массив строку в TypeScript?
Ссылка и выполнение внешнего JavaScript-файла, размещенного на GitHub