2013-07-26 2 views
5

Я новичок в javascript и все еще согласен с нюансами языка.Лучший способ проверки связки условий

У меня есть часть кода, где я должен проверить набор условий на конкретную переменную.

if (a=="MAIN_DOMAINNAME" || a=="DOMAIN_SERIAL" || a=="DOMAIN_REFRESH" || a=="DOMAIN_RETRY" || a=="DOMAIN_EXPIRE" || a=="DOMAIN_NEGTTL" || a=="MAIN_NS") { 

Есть ли лучший способ сделать это условный чек, как говорят:

if a is one of ("DOMAIN_SERIAL", "MAIN_DOMAINNAME", "DOMAIN_REFRESH") {?

ответ

13

Предполагая, что относительно современный браузер, вы можете использовать Array.indexOf(spec)

if (["DOMAIN_SERIAL", "MAIN_DOMAINNAME", "DOMAIN_REFRESH"].indexOf(a) !== -1) 

Примечания - вы можете легко Призонную шайбу это для старых браузеров (см the mdn link о том, как).

+5

8 upvotes в течение минуты для такого тривиального ответа O_o (и ни одного вопроса). –

+1

+1 для shim .. и объяснение точки современного браузера :) –

+1

Простой и элегантный решение .... :) –

2

Регулярное выражение будет короче и работает везде:

if (/^(MAIN_DOMAINNAME|DOMAIN_SERIAL|DOMAIN_REFRESH|..)$/.test(a)) { 
    // do stuff 
} 

FIDDLE

+2

Это не эквивалентно. Не забывайте, что^и $. –

+0

@RobW - хорошая точка – adeneo

1
var ars = ["DOMAIN_SERIAL", "MAIN_DOMAINNAME", "DOMAIN_REFRESH"]; 
if(ars.some(function(ar){ return a === ar; })){ 
    // do smth 
} 
0

Я предпочитаю регулярки решения уже предоставленное adeneo, но если вы хотите что-то, что соответствует

if a is one of (... 

формулировка по вопросу достаточно близко вы можете это сделать:

if (a in list("MAIN_DOMAINNAME", "DOMAIN_SERIAL", "DOMAIN_REFRESH", "DOMAIN_RETRY")) { 
    // do something     (rest of list omitted to avoid scrolling) 
} 

, предоставляя вспомогательную функцию, чтобы включить список в объект:

function list() { 
    var o={}, i; 
    for (i=0; i < arguments.length; i++) o[arguments[i]] = true; 
    return o; 
} 

Конечно, вы можете опустить вспомогательную функцию и просто использовать литерал объекта, но это некрасиво:

if (a in {"MAIN_DOMAINNAME":1, "DOMAIN_SERIAL":1, "DOMAIN_REFRESH":1}) { 
1

Следует упомянуть оператор switch, поскольку он должен работать нормально с примером, приведенным в вопросе.

switch(a) { 
    case('MAIN_DOMAINAME'): 
    case('DOMAIN_SERIAL'): 
    case('DOMAIN_REFRESH'): 
    case('DOMAIN_RETRY'): 
    console.log('Go wild.'); 
    break; 
} 

Не так легкий, как другие ответы, но он доступен для чтения и соответствует (a === b).

Смежные вопросы