多个嵌套switch语句的最佳替代方案?

时间:2019-01-22 07:44:34

标签: javascript switch-statement

我有一个带有多个嵌套开关大小写的JavaScript函数,这完全是一团糟。该功能在过去几个月中得到了扩展,现在我想重组代码。 在每种情况下,都应将一个不同的值推送到一个已经存在的变量中。

这是我的代码示例:

switch(var1){
    case 1:
        switch(var2){
            case 0:
                switch(var3){
                    case 'test':
                        switch(i){
                            case 0: endresult.push({id: i, content: '123'}); break;
                            case 2: endresult.push({id: i, content: '124'}); break;
                        }
                        break;
                    default:
                        endresult.push({id: i, content: '125'}); break;
                }
                break;
            case 1:
                endresult.push({id: i, content: '126'}); break;
        }
        break;
    case 2:
        switch(var2){
            case 0:
                switch(i){
                    case 0: endresult.push({id: i, content: '127'}); break;
                    case 2: endresult.push({id: i, content: '128'}); break;
                }
                break;
            case 1:
                switch(i){
                    case 0: endresult.push({id: i, content: '128'}); break;
                    case 2: endresult.push({id: i, content: '129'}); break;
                }
                break;
        }
        break;
}

重写此内容的最佳方法是什么?

3 个答案:

答案 0 :(得分:3)

具有所有可能的变化及其值的地图:

// Key is composite of `"" + var1 + "_" + var2 + "_" + i` and trimmed `_` from back

let tree = {
    '1_0_test_0': '123',
    '1_0_test_2': '124',
    '1_0_test': '125',
    '1_0_1': '126',
    ...
}

let key = ("" + var1 + var2 + i).replace(/_{2,}|_+$/, '');

if (typeof tree[key] !== 'undefined') {
    endresult.push({id: i, content: tree[key]});
}

答案 1 :(得分:1)

您关心的是可读性吗?您可能需要稍微拆分一下代码。并使用变量名代替0和1。此外,您还需要提供更多详细信息。像它可以超越0和1到2和3等等等。我不确定您如何调用代码。

但是,您可以尝试(将对象和if-else混合使用):

const decideFn = ({ var1, var2, var3, i }) = {
    const decision = {
        1: {
            0: {
                cond(i) {
                    if (var3 === 'test') {
                        if (i === 0) 
                            endresult.push({id: i, content: '123'})
                        else if (i === 2) 
                            endresult.push({id: i, content: '124'})
                        else 
                            endresult.push({id: i, content: '125'})
                    }
                    else endresult.push({id: i, content: '125'})
                }
            },
            1: {
                cond(i) { 
                   endresult.push({id: i, content: '126'}) 
                }
            }
        }
        2: {
            0: {
                cond(i) {            
                    if (i === 0) 
                        endresult.push({id: i, content: '127'})
                    else if (i === 2) 
                        endresult.push({id: i, content: '128'})}
                },
            1: {
                cond(i) {
                    if (i === 0) 
                        endresult.push({id: i, content: '128'})
                    else if (i === 2) 
                        endresult.push({id: i, content: '129'}) 
                }
            }
        }
    }

    // usage
    // does i go in a loop ?
    // your qn needs more details. but i hope you get the idea
    decision[var1][var2].cond(i)

}

最终,它确实可以归结为您如何最佳地理解代码以及其他开发人员将如何阅读您的代码,但就我个人而言,我认为您的switch语句很好。

对象可能会提供更多的灵活性。

答案 2 :(得分:0)

如果在每种情况下都使用同一个变量,我会考虑创建一个函数,其唯一的工作就是根据变量确定正确的值。

这可能看起来像这样:

const getContentValue(var1, var2, var3, i) {
 if (var1 === 1) {
   if (var2 === 0) {
     if (var3 === 'test') {
       if (i === 0) return '123'
       if (i === 2) return '124'
       return '125'
   }
   if (var2 === 1) {
     return '126'
   }
 }
 if (var1 === 2) {
   if (var2 === 0) {
     if (i === 0) return '127'
     if (i === 2) return '128'
   }
   if (var2 === 1) {
     if (i === 0) return '128'
     if (i === 2) return '129'
   }
 }
}

endResult.push({ id: i, content: getContentValue(var1, var2, var3, i) })

(代码未经测试。)

需要注意的几件事和要删除的一些原则:

  • 基本的“决策结构”相同,但是通过使用if语句进行了简化。在我看来,在多个案例之间切换是您在有很多案例时要做的事情,而不是在两件事之间切换。当您在两个选项之间切换时,if语句非常有用。如果您确实在处理大量案例,则说您的var1实际上可能是10多个不同的数字,使用switch可能更简单。
  • 如果您在代码中查看switch语句,那么每种情况都有很多相同之处。一种技巧是查看每种情况下答案的变化。 i是相同的。只有数字改变。这是一条简化事情的好方法。
  • 我认为这不是故意的,但是您有两种情况得出的数字128。您可能可以做一些其他简化。 (很难确切地知道是因为我知道您拥有的样本数据并不完全是您正在使用的真实数据。)我评论是因为这实际上是一个很好的教学时间-如果您拥有相同的最终用例,那就需要采取一些措施很好看。
  • 请注意switch语句和if语句在概念上的相似之处。在函数中,如果有return语句,它将像break语句的switch一样工作。如果您要在每个if案例之后返回,则当您有足够的信息知道要返回的内容时,将相当于default案例。 (例如,请参见显示return '125'的行。我们知道,如果到此为止,应该返回125。)