Javascript/NodeJs优化重复if-else

Javascript/NodeJs优化重复if-else,javascript,if-statement,Javascript,If Statement,如何重构/重写下面的代码以提高可读性和可维护性? 我有两个主分支,每个分支都有相同的if-else链,有3个选项和3个子选项。我总共有9个Leaf,需要执行9个不同的函数 function selectFunctionToRun(){ if (isFirstOption()) { if(isAlpha()){ if(isXRay()){ do1(); }else if (isYankee()

如何重构/重写下面的代码以提高可读性和可维护性? 我有两个主分支,每个分支都有相同的if-else链,有3个选项和3个子选项。我总共有9个Leaf,需要执行9个不同的函数

function selectFunctionToRun(){
    if (isFirstOption()) {
        if(isAlpha()){
            if(isXRay()){
                 do1();
            }else if (isYankee()){
                 do2();
            }else if (isZebra()){
                 do3();
            }
        }else if (isBeta()){
            if(isXRay()){
                 do4();
            }else if (isYankee()){
                 do5();
            }else if (isZebra()){
                 do6();
            }
        }else if (isCharlie()){
            if(isXRay()){
                 do7();
            }else if (isYankee()){
                 do8();
            }else if (isZebra()){
                 do9();
            }
        }
    }
    else if(isSecondOption(){
        if(isAlpha()){
            if(isXRay()){
                do11();
            }else if (isYankee()){
                do12();
            }else if (isZebra()){
                do13();
            }
        }else if (isBeta()){
            if(isXRay()){
                do14();
            }else if (isYankee()){
                do15();
            }else if (isZebra()){
                do16();
            }
        }else if (isCharlie()){
            if(isXRay()){
                do17();
            }else if (isYankee()){
                do18();
            }else if (isZebra()){
                do19();
            }
        }
    }
}

提前非常感谢。

好吧,这更简洁,但我不确定这是否值得你付出努力。 我在每种情况下都增加了一些额外的复杂性,以防没有一个选项是正确的。如果其中一个得到保证,则可以避免整个“中止”逻辑


好吧,这更简洁,但我不确定是否值得你这么做。 我在每种情况下都增加了一些额外的复杂性,以防没有一个选项是正确的。如果其中一个得到保证,则可以避免整个“中止”逻辑


您可能会将if/else/elseif结构重组为类似以下内容:

var cases = {
    1: do1,
    2: do2,
    3: do3
};

if (cases[something]) {
    cases[something]();
}

来源:

您可能会将if/else/elseif结构重组为类似以下内容:

var cases = {
    1: do1,
    2: do2,
    3: do3
};

if (cases[something]) {
    cases[something]();
}

来源:

斯科特解决方案的替代方案

var functionMap = {
    _1AX: do1, _1AY: do2, _1AZ: do3, 
    _1BX: do4, _1BY: do5, _1BZ: do6, 
    _1CX: do7, _1CY: do8, _1CZ: do9,

    _2AX: do11, _2AY: do12, _2AZ: do13, 
    _2BX: do14, _2BY: do15, _2BZ: do16,
    _2CX: do17, _2CY: do18, _2CZ: do19
  }

function selectFunctionToRun () {
  var index = (isFirstOption () ? '_1' : isSecondOption() ? '_2' : '') +
              (isAlpha () ? 'A' : isBeta () ? 'B' : isCharlie () ? 'C' : '') +
              (isXRay () ? 'X' : isYankee () ? 'Y' : isZebra () ? 'Z' : '';

  (functionMap [index] || function error () { ... }) (index);

如果根据属性名称命名处理程序函数,则可以消除
functionMap

是+Scott解决方案的替代方案

var functionMap = {
    _1AX: do1, _1AY: do2, _1AZ: do3, 
    _1BX: do4, _1BY: do5, _1BZ: do6, 
    _1CX: do7, _1CY: do8, _1CZ: do9,

    _2AX: do11, _2AY: do12, _2AZ: do13, 
    _2BX: do14, _2BY: do15, _2BZ: do16,
    _2CX: do17, _2CY: do18, _2CZ: do19
  }

function selectFunctionToRun () {
  var index = (isFirstOption () ? '_1' : isSecondOption() ? '_2' : '') +
              (isAlpha () ? 'A' : isBeta () ? 'B' : isCharlie () ? 'C' : '') +
              (isXRay () ? 'X' : isYankee () ? 'Y' : isZebra () ? 'Z' : '';

  (functionMap [index] || function error () { ... }) (index);

如果您根据属性名称命名处理程序函数,则可以消除
functionMap

我假设
isFirstOption()
isSecondOption()
的值是动态的,对吗?这18个函数真的有那么大的不同吗?感谢您的回复。这些问题的答案是肯定的。在我的实际项目中,我有4个选项和36个不同的功能。例如,我只写了两个选项。我假设
isFirstOption()
isSecondOption()
的值是动态的,对吗?这18个函数真的有那么大的不同吗?谢谢回复。这些问题的答案是肯定的。在我的实际项目中,我有4个选项和36个不同的功能。例如,我只写了两个选项。我确信
isX
函数可以进一步简化,直接返回
选项
abc
xyz
值,所以+1:-)@Bergi谢谢。是的,至少在本例中,听起来我们只是想查看单个数据成员的值,但我认为NodeJsBeginner一定有增加复杂性的原因。我确信
isX
函数可以进一步简化,直接返回
选项
abc
xyz
值,所以+1:-)@Bergi谢谢。是的,至少在这个示例中,听起来我们真的只想查看单个数据成员的值,但我认为NodeJsBeginner增加复杂性一定有原因。这与Scott在上面发布的内容类似。不过,他的回答非常详细。斯科特的道具。这与斯科特在上面发布的内容类似。不过,他的回答非常详细。斯科特的道具。