Я пытаюсь понять, как я могу применить два разных условия к одному выводу в операторе switch. Например, у меня есть функция для стилизации строки в зависимости от того, какие аргументы получает второй параметр. Первый и второй вывод в порядке, так как у них есть только один аргумент для стиля, а у третьего вывода есть. Я не могу найти способ применить к строке как прописные, так и обратные стили. Я пытался зациклить оператор switch. Я хотел бы знать, есть ли какие-либо хорошие решения для этого.
function caseStyle(string, style) {
function toUpper(string) {
string = string.toUpperCase();
return string;
}
function toReversed(string) {
string = string.split("").reverse().join("");
return string;
}
switch (style) {
case "upper":
string = toUpper(string);
break;
case "reversed":
string = toReversed(string);
break;
}
return string;
}
console.info(caseStyle("hello", "upper")); //output: HELLO
console.info(caseStyle("hello", "reversed")); //output: olleh
console.info(caseStyle("hello", ["upper", "reversed"])); // expected output: OLLEH
Вам нужно будет проверить, является ли style массивом, и соответствующим образом обрабатывать
Проверьте, является ли стиль массивом. если нет, сделайте его массивом из одного элемента, например style = [style], а затем выполните цикл for для массива стилей, который проверяет каждый элемент. Это позволит вам иметь столько стилей, сколько вы хотите
Вам нужно будет проверить, является ли style массивом, и соответствующим образом обрабатывать
Или заставьте его быть массивом style = [style].flat(), а затем повторите этот массив
.flat() будет сглаживать массив в случае, когда массив передается в
Следующее
function caseStyle(string, style) {
style = [style].flat();
function toUpper(string) {
string = string.toUpperCase();
return string;
}
function toReversed(string) {
string = string.split("").reverse().join("");
return string;
}
style.forEach(style => {
switch (style) {
case "upper":
string = toUpper(string);
break;
case "reversed":
string = toReversed(string);
break;
}
});
return string;
}
console.info(caseStyle("hello", "upper")); //output: HELLO
console.info(caseStyle("hello", "reversed")); //output: olleh
console.info(caseStyle("hello", ["upper", "reversed"])); // expected output: OLLEH
Почему бы вам просто не запустить простой цикл for? Вам также нужно будет проверить, не является ли ввод массивом, а затем превратить его в массив, если это еще не так.
function caseStyle(string, styles) {
function toUpper(string) {
string = string.toUpperCase();
return string;
}
function toReversed(string) {
string = string.split("").reverse().join("");
return string;
}
if (!(styles instanceof Array)) styles = [styles];
for (const style of styles) {
switch (style) {
case "upper":
string = toUpper(string);
break;
case "reversed":
string = toReversed(string);
break;
}
}
return string;
}
console.info(caseStyle("hello", "upper")); //output: HELLO
console.info(caseStyle("hello", "reversed")); //output: olleh
console.info(caseStyle("hello", ["upper", "reversed"])); // expected output: OLLEH
Вы запускали код?
@JaromandaX Извините, у меня небольшая ошибка. Я исправил это сейчас. Спасибо!
Есть также функция Array.isArray - но мне больше нравится мое решение: p, но это показывает, что есть много способов делать простые вещи в javascript
Вы можете использовать switch (true) следующим образом:
function caseStyle(string, style) {
function toUpper(string) {
string = string.toUpperCase();
return string;
}
function toReversed(string) {
string = string.split("").reverse().join("");
return string;
}
switch (true) {
case style === "upper":
string = toUpper(string);
break;
case style === "reversed":
string = toReversed(string);
break;
case style.includes("upper") && style.includes("reversed"):
string = toUpper(toReversed(string))
break;
default:
break;
}
return string;
}
console.info(caseStyle("hello", "upper"));//output: HELLO
console.info(caseStyle("hello", "reversed"));//output: olleh
console.info(caseStyle("hello", ["upper", "reversed"]));// expected output: OLLEH
Конечно, но что, если вы хотите добавить больше "функций"... тогда ваши операторы case станут громоздкими
Это не то, что вы просили
Я ничего не просил. Указывал на потенциальный недостаток в вашем решении. Ничего страшного, просто указал
Кроме некоторых ответов по существу здесь... Я бы представил другой подход:
toUpper
и toReversed
за пределы вашей функции caseStyle
. Там нет необходимости иметь их тамstr = str...
в функциях метода и снова в случае переключенияmethods
и назовите свои функции точно так же, как их строковые имена-ссылки.if
, всегда заставляйте второй массив (кстати, переименовывать его в styles
, во множественном числе) всегда быть массивом, преобразуя строку в массив. Более того, с помощью .split(/\W+/)
(разделенного на один или несколько символов, отличных от слов), теперь вы также можете передать строку, например "upper,reversed"
methods
и можете добавить больше в любой момент времени, и вы можете использовать в будущем ожидаемые имена методов (преобразования), которые у вас есть, например: caseStyle("hello", ["snake", "capitalize", "reverse"])
или больше.const methods = {
upper: str => str.toUpperCase(),
reversed: str => [...str].reverse().join(""),
};
const caseStyle = (str, styles) => {
if (typeof styles === "string") styles = styles.split(/\W+/);
return styles.reduce((acc, style) => methods[style](acc), str);
};
console.info(caseStyle("hello", "upper")); //output: HELLO
console.info(caseStyle("hello", "reversed")); //output: olleh
console.info(caseStyle("hello", ["upper", "reversed"])); // expected output: OLLEH
console.info(caseStyle("stack", "reversed upper")); // expected output: KCATS
Как вы можете заметить из вышеизложенного, я использовал предпочтительный синтаксис строкового расширения [...str] для преобразования строки в массив. Можно столкнуться с проблемами при использовании .split("") в строке, которая использует более одной кодовой точки для представления глифа, например, эмодзи:
console.info("ab📆🔞".split(""))
Подарит: ["a","b","�","�","�","�"]
console.info([..."ab📆🔞"])
Как вы можете видеть, смайлики правильно разделены и сохранены.
Вам нужно ввести новый случай. case "reversedUpper": return toUpper(toReversed(string))