Лучшая альтернатива для нескольких вложенных операторов switch? - PullRequest
0 голосов
/ 22 января 2019

У меня есть функция 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;
}

Как лучше всего это переписать?

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Ваша забота о читабельности не так ли?Возможно, вам нужно немного разделить код.И используйте имена переменных вместо 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)

}

В конечном счете, все сводится к тому, как вы чувствуете, что понимаете код лучше, и как другие разработчикибудет читать ваш код, но лично я думаю, что ваши заявления о переключении в порядке.

Хотя объекты могут дать больше гибкости.

0 голосов
/ 22 января 2019

Есть карта всех возможных вариантов и ее значений:

// 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]});
}
...