У меня есть код, который выглядит так:

TheClass = TheAjaxIndicator.prop('class');

if (TheClass.indexOf('Blue') > 0) { TheHTML = TheHTMLBlue; }
if (TheClass.indexOf('White') > 0) { TheHTML = TheHTMLWhite; }
if (TheClass.indexOf('Green') > 0) { TheHTML = TheHTMLGreen; }
if (TheClass.indexOf('Brown') > 0) { TheHTML = TheHTMLBrown; }

Как я могу избежать всех этих if утверждений?

Спасибо.

0
frenchie 24 Янв 2013 в 06:10

3 ответа

Лучший ответ

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

var html = {
   'Blue': TheHTMLBlue,
   'White': TheHTMLWhite,
   // ...
};

var match = TheClass.match(/Blue|White|Green|Brown/);
// also possible:
// var match = TheClass.match(RegExp(Object.keys(html).join('|'));
if (match) {
    TheHTML = html[match[0]];
}
1
Felix Kling 24 Янв 2013 в 02:34

Я поместил бы имена классов и значения в карту, и перебрал бы карту, ища соответствие. Здесь (jsfiddle) - пример того, как это сделать.

var classToHtmlMap = {
    'Blue': TheHTMLBlue,
    'White': TheHTMLWhite,
    'Green': TheHTMLGreen,
    'Brown': TheHTMLBrown
}

var TheHTML;
var TheAjaxIndicator = $("#TheAjaxIndicator");
$.each(classToHtmlMap, function(key, value) {
    if(TheAjaxIndicator.hasClass(key)) {
        TheHTML = value;
            return false;
    }
});

Кстати, здесь используется jQuery, но метод один и тот же, независимо от того, как вы это делаете.

0
GreyBeardedGeek 24 Янв 2013 в 02:45

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

Наличие в своем коде операторов if никак не повлияет на производительность - это 2013 год, и у нас есть скриптовые движки JIT. Ваш код также очень читабелен - я не вижу причин для его изменения (кроме соглашения об именах). Но вы можете использовать выражение switch , но только если атрибут class имеет одно значение:

switch( theAjaxIndicator.prop('class') ) {
    case "Blue" : theHTML = theHTMLBlue;  break;
    case "White": theHTML = theHTMLWhite; break;
    case "Green": theHTML = theHTMLGreen; break;
    case "Brown": theHTML = theHTMLBrown; break;
}

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

eval('theHTML = theHTML' + theAjaxIndicator.prop('class') + ';');

Но этот код будет медленнее, поскольку он вызывает перекомпиляцию скрипта. Я не знаю, как работает JIT в этом случае.

-1
Dai 24 Янв 2013 в 02:15