如何在一个案例内执行多个其他案例

问题描述 投票:0回答:2

所以有可能将这个案例转变成另一个案例:

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;
}

我研究了标记语句的选项,但它似乎在这里不起作用。
我在这里看到的唯一选择是为每种情况创建新函数,但我想知道 - 是否有更好、更干净、更易读和/或更短的选项?

我正在寻找所有提示 - 无论是我缺少的某个关键字、您干净利落地完成此操作的个人提示,还是库,甚至来自其他语言(如打字稿等)的命题。

javascript if-statement switch-statement pattern-matching
2个回答
0
投票

尼克帕森提出了这个很棒的想法:

也许将整个开关包装在一个接受变量的函数中并进行递归调用?

在这种情况下效果非常好;因此,将其合并到我发布的示例中并接受它作为答案:

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;
  }
}

它很干净,可以解决问题...此外 - 如果您在 switch 语句通常所在的位置声明函数(例如在某个外部函数内),您将能够更改在外部函数中声明的变量,就像您一样能够进入 switch 语句。

(我会在 2 天内接受这个答案,将此问题标记为已回答,除非 Nick 会发布自己的答案以获取信用)


0
投票

从我上面的评论...

使用命名函数怎么样? ...就像

doSomething_1
doSomething_2
doSomething_3
,其中后者是这样实现的...
function doSomething_3() { doSomething_2(); doSomething_1(); }
,并且其中为每个匹配案例调用一个特定于案例的函数

既然OP显然控制着switch-case相关代码,为什么不将每个案例的具体处理作为自己的函数来实现。因此,首先将特定于案例的处理的实现与

mySwitch
函数(OP 自己的答案之一)解耦,其次为 OP 示例代码的第三个案例启用代码重用。

在我看来,下一个提供的示例代码比OP在他自己的答案中提出的内容更容易理解......

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

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

console.log('mySwitch(3) ...');
mySwitch(3);
.as-console-wrapper { min-height: 100%!important; top: 0; }
<script>
function handleCase1() {
  console.log('handling case 1');
}
function handleCase2() {
  console.log('handling case 2');
}
function handleCase3() {
  console.log('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.log('mySwitch(0) ...');
mySwitch(0);

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.