Есть ли более простой способ определить, равна ли переменная диапазону значений, например:
if x === 5 || 6
а не что-то тупое:
if x === 5 || x === 6
?
Есть ли более простой способ определить, равна ли переменная диапазону значений, например:
if x === 5 || 6
а не что-то тупое:
if x === 5 || x === 6
?
Вы можете зачеркнуть свои значения внутри массива и проверить, существует ли переменная в массиве с помощью [].indexOf
:
if([5, 6].indexOf(x) > -1) {
// ...
}
Если -1
возвращается, то переменная не выходит из массива.
Зависит от того, какой тип теста вы выполняете. Если у вас есть статические строки, это очень легко проверить с помощью регулярных выражений:
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
проверит только объект, поэтому имейте в виду, что они разные.
Это прекрасно. Если у вас более длинный список значений, возможно, вы можете использовать следующее:
if ([5,6,7,8].indexOf(x) > -1) {
}
Да. Вы можете использовать свою собственную функцию. В этом примере используется .some
:
var foo = [ 5, 6 ].some(function(val) {
return val === x;
});
foo; // true
Вот что я решил использовать:
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
}
Преимущества:
Если вы не хотите разрешать принуждение типа (indexOf
нет), измените два ==
на ===
. Как это видно:
fav = "4231";
plu.indexOf(fav) //-1
fav.isin(plu) //true
нет, может быть несколько трюков, специфичных для случая, но в целом я пишу код следующим образом:
if (someVariable === 1 ||
someVariable === 2 ||
someVariable === 7 ||
someVariable === 12 ||
someVariable === 14 ||
someVariable === 19) {
doStuff();
moreStuff();
} else {
differentStuff();
}
Простой ответ - нет. Вы можете использовать оператор switch, который легче читать, если вы сравниваете множество строковых значений, но использование его для двух значений выглядело бы не лучше.
[Edit] это похоже на работу, но, как заметил Дэн, это на самом деле ложный позитив. Не используйте этот метод. Я оставляю его здесь для образовательных целей.
Самый простой способ узнать:
a = [1,2,3,4,5];
if(3 in a) alert("true"); // will alert true
Протестировано в консоли Chrome. Не уверен, что он работает в других браузерах.