Как выполнить несколько других дел внутри дела

Таким образом, можно перейти от случая к другому случаю:

switch(variable) {
  case 1:
    // do something 1
  case 2:
    // do something 2
    break;
  case 3:
    // do something 3
    break;
}

Но что, если мы захотим выполнить несколько других кейсов после завершения основного кейса или выполнить другой кейс, который не следует непосредственно после основного кейса? Например, псевдокод:

switch(variable) {
  case 1:
    // do something 1
    break;
  case 2:
    // do something 2
    break;
  case 3:
    // do something 3
    execute case 2;
    execute case 1;
    break;
}

Я исследовал вариант помеченных утверждений, но, похоже, здесь он не сработает.
Единственный вариант, который я здесь вижу, — это создавать новую функцию для каждого случая, но мне интересно, есть ли вариант лучше, чище, читабельнее и/или короче?

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

Может быть, обернуть весь switch в функцию, которая принимает variable, и выполнить рекурсивный вызов?

Nick Parsons 12.03.2024 12:06

Этот ваш псевдокод не имеет особого смысла. Что должно произойти, если через execute case 2 будет достигнут break в случае 2, что завершает оператор переключения случая? Вы никогда не сможете выполнить вариант 1.

Davi 12.03.2024 12:07

Как насчет использования именованных функций? ... например doSomething_1, doSomething_2, doSomething_3, где последний реализован следующим образом... function doSomething_3() { doSomething_2(); doSomething_1(); }, и где для каждого соответствующего случая вызывается ровно одна функция, специфичная для конкретного случая.

Peter Seliger 12.03.2024 12:14

просто используйте if..else if...else, switch менее универсален

Alexander Nenashev 12.03.2024 12:20

@AlexanderNenachev Ого, это буквально мем, который ходит в кругах разработчиков. Не делайте этого (обязательно). Возможно, это «менее универсально», но это чертовски хороший шаблон, если вы сопоставляете одну переменную с несколькими результатами, например, с предопределенными константами.

somethinghere 12.03.2024 14:44

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

Alexander Nenashev 12.03.2024 15:16

@AlexanderNenachev Я все время использую переключатель с константами, которые передаются для маршрутизации, чтобы увидеть, совпадают ли определенные значения, вместо того, чтобы создавать 10 условий «если». switch имеет свои цели, и если вы можете его использовать, использование строки if/else не является правильным решением.

somethinghere 12.03.2024 15:18
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
7
75
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Ник Парсон подал потрясающую идею:

Может быть, обернуть весь переключатель в функцию, принимающую переменную, и выполнить рекурсивный вызов?

Что отлично работает в этой ситуации; Итак, чтобы включить это в пример, который я опубликовал, и принять его как ответ:

mySwitch(variable);
function mySwitch(_v) {
  switch(_v) {
    case 1:
      // do something 1
    break;
    case 2:
      // do something 2
    break;
    case 3:
      // do something 3
      mySwitch(2);
      mySwitch(1);
    break;
  }
}

Это чисто, делает свое дело... и более того - если вы объявляете функцию там, где обычно находится оператор переключения (например, внутри какой-либо внешней функции), вы сможете изменять переменные, объявленные во внешней функции, точно так же, как вы могли бы это сделать внутри оператора переключения.

Из моего комментария выше...

Как насчет использования именованных функций? ... например doSomething_1, doSomething_2, doSomething_3, где последний реализован следующим образом... function doSomething_3() { doSomething_2(); doSomething_1(); }, и где для каждого соответствующего случая вызывается ровно одна функция, специфичная для конкретного случая.

Поскольку ОП явно контролирует код, связанный с переключателем, почему бы не реализовать обработку каждого случая как собственную функцию. Таким образом, во-первых, мы отделяем реализацию обработки конкретного случая от функции mySwitch (одной из собственных ответов ОП) и, во-вторых, включаем повторное использование кода для третьего случая примера кода ОП.

Следующий приведенный пример кода, на мой взгляд, гораздо легче понять, чем то, что придумал ОП в своем собственном ответе...

function mySwitch(value) {
  switch (value) {
    case 1:
      handleCase1();
      break;
    case 2:
      handleCase2();
      break;
    case 3:
      handleCase3();
      break;
  }
}
console.info('mySwitch(1) ...');
mySwitch(1);

console.info('mySwitch(2) ...');
mySwitch(2);

console.info('mySwitch(3) ...');
mySwitch(3);
.as-console-wrapper { min-height: 100%!important; top: 0; }
<script>
function handleCase1() {
  console.info('handling case 1');
}
function handleCase2() {
  console.info('handling case 2');
}
function handleCase3() {
  console.info('handling case 3 which invokes handling of 2 and 1');

  handleCase2();
  handleCase1();
}
</script>

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

function mySwitch(value) {
  ({
    '1': handleCase1,
    '2': handleCase2,
    '3': handleCase3,
  })[String(value)]?.();
}
console.info('mySwitch(0) ...');
mySwitch(0);

console.info('mySwitch(1) ...');
mySwitch(1);

console.info('mySwitch(2) ...');
mySwitch(2);

console.info('mySwitch(3) ...');
mySwitch(3);

console.info('mySwitch(4) ...');
mySwitch(4);
.as-console-wrapper { min-height: 100%!important; top: 0; }
<script>
function handleCase1() {
  console.info('handling case 1');
}
function handleCase2() {
  console.info('handling case 2');
}
function handleCase3() {
  console.info('handling case 3 which invokes handling of 2 and 1');

  handleCase2();
  handleCase1();
}
</script>

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