Оператор Switch: применение нескольких аргументов в одном выводе

Я пытаюсь понять, как я могу применить два разных условия к одному выводу в операторе 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

Вам нужно ввести новый случай. case "reversedUpper": return toUpper(toReversed(string))

Janatbek Orozaly 11.01.2023 03:06

Вам нужно будет проверить, является ли style массивом, и соответствующим образом обрабатывать

Jaromanda X 11.01.2023 03:08

Проверьте, является ли стиль массивом. если нет, сделайте его массивом из одного элемента, например style = [style], а затем выполните цикл for для массива стилей, который проверяет каждый элемент. Это позволит вам иметь столько стилей, сколько вы хотите

Dave Pile 11.01.2023 03:11
Что такое двойные вопросительные знаки (??) в JavaScript?
Что такое двойные вопросительные знаки (??) в JavaScript?
Как безопасно обрабатывать неопределенные и нулевые значения в коде с помощью Nullish Coalescing
Асинхронная передача данных с помощью sendBeacon в JavaScript
Асинхронная передача данных с помощью sendBeacon в JavaScript
В современных веб-приложениях отправка данных из JavaScript на стороне клиента на сервер является распространенной задачей. Одним из популярных...
Принципы ООП в JavaScript
Принципы ООП в JavaScript
Парадигма объектно-ориентированного программирования имеет 4 основных принципа,
Laravel с Turbo JS
Laravel с Turbo JS
Turbo - это библиотека JavaScript для упрощения создания быстрых и высокоинтерактивных веб-приложений. Она работает с помощью техники под названием...
Слишком много useState? Давайте useReducer!
Слишком много useState? Давайте useReducer!
Современный фронтенд похож на старую добрую веб-разработку, но с одной загвоздкой: страница в браузере так же сложна, как и бэкенд.
Типы данных JavaScript
Типы данных JavaScript
В JavaScript существует несколько типов данных, включая примитивные типы данных и ссылочные типы данных. Вот краткое объяснение различных типов данных...
2
3
55
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

Вы запускали код?

Jaromanda X 11.01.2023 03:11

@JaromandaX Извините, у меня небольшая ошибка. Я исправил это сейчас. Спасибо!

Michael M. 11.01.2023 03:12

Есть также функция Array.isArray - но мне больше нравится мое решение: p, но это показывает, что есть много способов делать простые вещи в javascript

Jaromanda X 11.01.2023 03:14

Вы можете использовать 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 станут громоздкими

Jaromanda X 11.01.2023 03:15

Это не то, что вы просили

NirG 11.01.2023 03:21

Я ничего не просил. Указывал на потенциальный недостаток в вашем решении. Ничего страшного, просто указал

Jaromanda X 11.01.2023 03:35

Кроме некоторых ответов по существу здесь... Я бы представил другой подход:

  • Переместите внутренние функции toUpper и toReversed за пределы вашей функции caseStyle. Там нет необходимости иметь их там
  • Используйте стрелочные функции и неявный возврат вместо того, чтобы делать дважды(!) str = str... в функциях метода и снова в случае переключения
  • Сгруппируйте свои функции в объект с именем methods и назовите свои функции точно так же, как их строковые имена-ссылки.
  • Вместо switch-case используйте Array.prototype.reduce()
  • Вместо того, чтобы оборачивать логику String/or/Array в оператор 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("") в строке, которая использует более одной кодовой точки для представления глифа, например, эмодзи:

Проблема при использовании .split("")

console.info("ab📆🔞".split(""))

Подарит: ["a","b","�","�","�","�"]

Лучшее разделение строки: с использованием синтаксиса Spread:

console.info([..."ab📆🔞"])

Как вы можете видеть, смайлики правильно разделены и сохранены.

Другие вопросы по теме