【问题标题】:clever way to execute code block if any condition in if/else if was true如果 if/else if 中的任何条件为真,则执行代码块的聪明方法
【发布时间】:2020-03-02 03:52:02
【问题描述】:

我经常有 if/else if 块部分包含相同的代码。我想只需要编写一次此代码,类似于“not else”(如果没有满足先前条件,则执行 else 块,如果满足任何先前条件,则将执行 not else 块)。我知道您可以在每个块中设置一个标志并测试之后是否设置了该标志,或者创建一个在每个块中调用的函数(如果您不需要编辑局部变量)。你有一个更聪明/优雅的解决方案的想法吗? 在校对问题时,我想出了在 else 块中返回并将您的公共代码放在其后的想法 - 仅在您之前不必返回时才有效。

if (condition1) {
    /* unique code1 */
    /* common code */        

} else if (condition2) {
    /* unique code2 */
    /* common code */ 

} else if (condition3) {
    /* unique code3 */
    /* common code */ 

} else if (condition4) {
    /* unique code4 */
    /* common code */ 

}

【问题讨论】:

    标签: javascript if-statement


    【解决方案1】:

    一个非常规的解决方案是一个迭代一次的循环,从而为您提供break 选项:

    do {
        if (condition1) {
            // ...
        } else if (condition2) {
            // ...
        } else if (condition3) {
            // ...
        } else break;
        // common code
    } while (false);
    

    但为了可读性,我会选择您在问题中已经提到的标志选项。

    【讨论】:

      【解决方案2】:

      100 次中有 99 次,我会选择 caw 在他的现已删除答案中建议的内容。

      但如果您有一组非常长的条件(比如超过 10 个),您可以考虑使用映射(关联数组)来查找条件的代码路径

      let action_table = [];
      action_table["condition1"] = ()=>{/* unique code 1 */};
      action_table["condition2"] = ()=>{/* unique code 2 */};
      action_table["condition3"] = ()=>{/* unique code 3 */};
      action_table["condition4"] = ()=>{/* unique code 4 */};
      
      let condition = /*compute condition based on variables and state*/;
      action_table[condition](); /* execute unique code action */
      unique_code();
      
      /* common code */
      

      当每个条件的唯一代码路径正在做一些琐碎的事情(如转换值、设置解析状态、处理标记等)并且公共代码是函数的核心时,这可能很有用目的是。通常,当原始实现开始有太多 if/else 条件时,您会切换到上述内容。

      【讨论】:

      • 我想知道“不是别的”逻辑在哪里?如果没有任何if,公共代码将在任何情况下执行。为什么unique_code() ... 是独一无二的?
      • 我将把它留给 OP 练习。他可以使用每个操作设置的状态标志或表中的某种无操作条件。
      • 我认为那就是问题所在。
      【解决方案3】:

      您可以将条件及其各自的代码存储在一个列表中,如下所示:

      const conditions = [
        [condition1, () => {/* unique code1 */}],
        [condition2, () => {/* unique code2 */}],
        [condition3, () => {/* unique code3 */}],
        [condition4, () => {/* unique code4 */}],
      ];
      
      const hasTruthy = conditions.some(([condition, fn]) => {
        if (condition) {
          fn();
          return true;
        }
      });
      
      if (hasTruthy) {
        /* common code */
      }
      

      但这可能只有在所有条件都很便宜的情况下才是可取的。如果它们对性能要求很高,即使实际上只需要检查一些,它们也会全部执行。如果条件确实很昂贵,您可以使用函数调用而不是实际条件,并在some 循环中调用它们。

      【讨论】:

      • 你应该使用 some 并返回条件而不是使用 for each,因为你不会在第一个 true 条件之后停止(即这是 if、if、if、not if、if else...)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多