Есть ли лучший способ написать этот JavaScript? - PullRequest
0 голосов
/ 09 сентября 2011

Есть ли лучший способ написать этот JavaScript?

switch (l) {
    //A
    case '1-1-1':
    case '1-1-2':
    case '1-2-1':
    case '2-1-1':
    case '3-1-1':
        obj.result = 'A';
        break;
    //B
    case '1-2-2':
    case '1-2-3':
    case '2-2-2':
    case '2-2-3':
    case '3-2-2':
    case '3-3-1':
        obj.result = 'B';
        break;
    //C
    case '1-3-2':
    case '1-3-3':
    case '2-3-2':
    case '3-2-3':
        obj.result = 'C';
        break;
    //D
    case '3-3-2':
    case '3-3-3':
        obj.result = 'D';
        break;
    default:
        obj.result = 'AA';
        break;
}

Ответы [ 3 ]

1 голос
/ 09 сентября 2011

Таблица поиска, как упомянуто Тило в комментариях:

var lookup =
{
    '1-1-1': 'A',
    '1-1-2': 'A',
    '1-2-1': 'A',
    '2-1-1': 'A',
    '3-1-1': 'A',

    '1-2-2': 'B',
    '1-2-3': 'B',
    '2-2-2': 'B',
    '2-2-3': 'B',
    '3-2-2': 'B',
    '3-3-1': 'B',

    '1-3-2': 'C',
    '1-3-3': 'C',
    '2-3-2': 'C',
    '3-2-3': 'C',
    '3-3-2': 'C',

    '3-3-3': 'D'
};

и ее использование:

obj.result = lookup[l] || 'AA';

Не могу сказать, что это действительно лучше, чем switch версия.

1 голос
/ 09 сентября 2011

Если вы скажете нам, как вы получили эти значения, мы могли бы найти более краткое решение, но вот как вы будете использовать таблицу поиска (сгенерированную в обратном порядке):

var byResult={
    A: ['1-1-1', '1-1-2', /* ... */],
    B: ['1-2-2', '1-2-3', /* ... */],
    /* ... */
};
var byInput={};
for(var output in byResult) {
    if(!Object.prototype.hasOwnProperty.call(byResult, output)) {
        continue;
    }
    var inputs=byResult[output];
    for(var i=0, l=inputs.length; i<l; i++) {
        var input=inputs[i];
        byInput[input]=output;
    }
}
function lookup(value) {
    if(Object.prototype.hasOwnProperty.call(byInput, value)) {
        return byInput[value];
    }else{
        return 'AA';
    }
}
0 голосов
/ 09 сентября 2011

Инкапсулируйте обработку числа в букву, чтобы ваш основной код не знал, как выполняется перевод. Назовите это так:

obj.result = getThing(l);

// or, given your comment that l is formed by concatenating three
// values you could do the concatenation in the function
obj.result = getThing(v1, v2, v3);

Тогда в getThing() вы можете использовать существующий оператор switch, или таблицу поиска из ответа Мэтта Болла, или любой другой метод, который вам нравится. И вы можете изменить метод в любое время, не влияя на код, который вызывает функцию.

function getThing(v1, v2, v3) {
   var l = v1 + "-" + v2 + "-" + v3;
   // use lookup, switch, whatever
   return "somecode";
}

Примечание: на самом деле не вызывайте вашу функцию "getThing"; замените «Вещь» на то, что описывает, какими бы ни были эти буквенные коды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...