Подтвердить что ты не робот

JavaScript: простой способ проверить, равна ли переменная двум или более значениям?

Есть ли более простой способ определить, равна ли переменная диапазону значений, например:

if x === 5 || 6 

а не что-то тупое:

if x === 5 || x === 6

?

4b9b3361

Ответ 1

Вы можете зачеркнуть свои значения внутри массива и проверить, существует ли переменная в массиве с помощью [].indexOf:

if([5, 6].indexOf(x) > -1) {
  // ...
}

Если -1 возвращается, то переменная не выходит из массива.

Ответ 2

Зависит от того, какой тип теста вы выполняете. Если у вас есть статические строки, это очень легко проверить с помощью регулярных выражений:

if (/^[56ab]$/.test(item)) {
//-or-
if (/^(foo|bar|baz|fizz|buzz)$/.test(item)) {
    doStuff();
} else {
    doOtherStuff();
}

Если у вас есть небольшой набор значений (строка или номер), вы можете использовать switch:

switch (item) {
case 1:
case 2:
case 3:
    doStuff();
    break;
default:
    doOtherStuff();
    break;
}

Если у вас есть длинный список значений, вы, вероятно, должны использовать массив с ~arr.indexOf(item) или arr.contains(item):

vals = [1,3,18,3902,...];
if (~vals.indexOf(item)) {
    doStuff();
} else {
    doOtherStuff();
}

К сожалению, Array.prototype.indexOf не поддерживается в некоторых браузерах. К счастью, доступен polyfill. Если вы столкнулись с проблемой полифинга Array.prototype.indexOf, вы можете добавить Array.prototype.contains.

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

var map = {
    foo: bar,
    fizz: buzz
}
if (item in map) {
//-or-
if (map.hasOwnProperty(item)) {
    doStuff(map[item]);
} else {
    doOtherStuff();
}

in проверит всю цепочку прототипов, а Object.prototype.hasOwnProperty проверит только объект, поэтому имейте в виду, что они разные.

Ответ 3

Это прекрасно. Если у вас более длинный список значений, возможно, вы можете использовать следующее:

if ([5,6,7,8].indexOf(x) > -1) {
}

Ответ 4

Да. Вы можете использовать свою собственную функцию. В этом примере используется .some:

var foo = [ 5, 6 ].some(function(val) {
     return val === x;
   });

foo; // true

Ответ 5

Вот что я решил использовать:

Object.prototype.isin = function() {
    for(var i = arguments.length; i--;) {
        var a = arguments[i];
        if(a.constructor === Array) {
            for(var j = a.length; j--;)
                if(a[j] == this) return true;
        }
        else if(a == this) return true;
    }
    return false;
}

Вы бы использовали его следующим образом:

var fav   = 'pear',
    fruit = ['apple', 'banana', 'orange', 'pear'],
    plu   = [4152, 4231, 3030, 4409];

if (fav.isin(fruit, plu, 'eggs', 'cheese')) {
    //do something cool
}

Преимущества:

  • он работает в IE < 9;
  • он читается естественно слева направо;
  • вы можете кормить его массивами или отдельными значениями.

Если вы не хотите разрешать принуждение типа (indexOf нет), измените два == на ===. Как это видно:

fav = "4231";
plu.indexOf(fav) //-1
fav.isin(plu)    //true

Ответ 6

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

if (someVariable === 1 ||
    someVariable === 2 ||
    someVariable === 7 ||
    someVariable === 12 ||
    someVariable === 14 ||
    someVariable === 19) {

    doStuff();
    moreStuff();

} else {
    differentStuff();
}

Ответ 7

Простой ответ - нет. Вы можете использовать оператор switch, который легче читать, если вы сравниваете множество строковых значений, но использование его для двух значений выглядело бы не лучше.

Ответ 8

[Edit] это похоже на работу, но, как заметил Дэн, это на самом деле ложный позитив. Не используйте этот метод. Я оставляю его здесь для образовательных целей.

Самый простой способ узнать:

a = [1,2,3,4,5];

if(3 in a) alert("true"); // will alert true

Протестировано в консоли Chrome. Не уверен, что он работает в других браузерах.