Оптимизировать ИЛИ в IF

У меня есть такой код:

if (action == 'John' || action == 'John Beckham' || action == 'Henry John'){
     alert('true!');
}

Как свести к минимуму этот код?

Должен работать в IE7.

Ответ 1

Если "Джон" всегда появляется, самое простое:

if (action.toLowerCase().indexOf("john") !== -1) {
    // Do something
}

... но поскольку ваш вопрос уже изменил значения, с которыми вы проверяете action один раз, я смущаюсь предположить это. Также обратите внимание, что он будет соответствовать "xxxjohnxxx", который может быть не таким, каким вы хотите.

Исходные предложения (обновленные для новых значений action из вашего редактирования):


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

String#indexOf:

if ("|john|john beckham|john henry|giggs john|scholes john|john messi|".indexOf("|" + action.toLowerCase() + "|") !== -1) {
    // Do something
}

Регулярные выражения:

if (/^(?:John|John Beckham|John Henry|Giggs John|Scholes John|John Messi)$/i.test(action)) {
    // Do something
}

Поскольку вы используете только истинный/ложный результат, я использую test, который просто возвращает true/false, а не exec, который возвращает соответствующие результаты. Оба работают в этом случае, но браузер может немного оптимизировать test (но тогда регулярное выражение вряд ли будет лучшим решением, если ваша цель - самый быстрый результат или наименьшее использование памяти).


Или a switch:

switch (action.toLowerCase()) {
    case "john":
    case "john beckham":
    case "john henry":
    case "giggs john":
    case "scholes john":
    case "john messi":
        // Do something
}

Или поиск объекта:

var actions = {
    "john":         true,
    "john beckham": true,
    "john henry":   true,
    "giggs john":   true,
    "scholes john": true,
    "john messi":   true
};

if (actions[action.toLowerCase()]) {
    // do something
}

(Это также имеет преимущество, позволяя вам сказать, что делать — например, true можно заменить на вызываемую вами функцию.)


Или (в среде с поддержкой ES5 или с помощью прокладки ES5) Array#indexOf:

if (["john", "john beckham", "john henry", "giggs john", "scholes john", "john messi"].indexOf(action.toLowerCase()) !== -1 {
    // Do something
}

или, поскольку вы используете jQuery, вы можете избежать прокладки старых браузеров, используя inArray:

if ($.inArray(action.toLowerCase(), ["john", "john beckham", "john henry", "giggs john", "scholes john", "john messi"]) !== -1) {
    // Do something
}

Ответ 2

если вы используете jquery, вы можете сделать:

var arr = ['a','b','c','d','e','f','g'];
if( $.inArray(action, arr) !== -1 ) {
  alert("true");
}

Ответ 3

Попробуйте это, он использует indexOf:

if (['a', 'b', 'c', 'd', 'e'].indexOf(action) > -1) {
  alert(true);
}

Обновление. Если вы хотите поддерживать IE7 и ниже, используйте ответ на этот вопрос

Если вы используете jQuery, вы можете использовать $.inArray следующим образом:

if ($.inArray(action, ['a','b','c','d') > -1) {
  alert(true);
}

UPDATE

Вы также можете использовать regexp с test (Группа делает регулярное выражение не совпадающим с "John Langhammerer"/actions с дополнительными символами те, которые должны быть сопоставлены):

if ((/^(John Langhammer|Piet Krauthammer|Some Guy)$/i).test(action)) {
  alert(true);
}

UPDATE: /i делает регистр regexp нечувствительным.

Ниже приведено решение, которое работало бы с одним действием char:

Вы также можете использовать String.indexOf, который поддерживается в IE7 (если ваши действия всего один char):

if ('abcde'.indexOf(action) > -1) {
  alert(true);
}

Ответ 4

Сделайте массив, как показано ниже.

var newAry = array('a','b','c');

Теперь просто проверьте его, как показано ниже.

$(function()
{
    var newAry = Array('a','b','c');
    if($.inArray(action,newAry)){ alert(action); }
});

Ответ 5

Кросс-браузерное решение:

if ( action in {'John':1, 'John Beckham':1, 'John Henry':1, 'Giggs John':1, 'Scholes John':1, 'John Messi':1 } ){
     alert('true!');
}

Ответ 6

Помимо indexOf, вы также можете использовать условный оператор в Javascript.

names = ['John' , 
         'John Beckham', 
         'John Henry' , 
         'Giggs John' , 
         'Scholes John', 
         'John Messi'
];
names.indexOf(action) != -1? alert('True') : alert ('False');

И вы хотите сделать более простое выражение, например:

 names.indexOf(action) != -1? doSomethingOnTrue() : doSomethingOnFalse(); 

Ответ 7

if('abcdefg'.indexOf(action) > -1){
    // action is one of 'abcdef'
}