JavaScript: Simple way to check if variable is equal to two or more values? [duplicate]
This question already has an answer here:
Is there an easier way to determine if a variable is equal to a range of values, such as:
if x === 5 || 6
rather than something obtuse like:
if x === 5 || x === 6
?
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
– Adam Templeton
Aug 24 ’12 at 20:56
indexOf
, or you can also use a regex /^(New York|Austin|Alberta)$/.test(x)
.– João Silva
Aug 24 ’12 at 21:02
indexOf
/^(New York|Austin|Alberta)$/.test(x)
– Alnitak
Aug 24 ’12 at 22:32
– Denly
Jan 9 at 6:27
8 Answers
8
You can stash your values inside an array and check whether the variable exists in the array by using .indexOf
:
.indexOf
if([5, 6].indexOf(x) > -1) {
// ...
}
If -1
is returned then the variable doesn’t exist in the array.
-1
a == 1 || a == 2
.– Reid
Aug 24 ’12 at 21:55
a == 1 || a == 2
$.inArray
. I’m not familiar with any other frameworks, but I’m sure they all include such functionality in some manner.– Reid
Aug 24 ’12 at 22:00
$.inArray
– Julix
Oct 14 ’16 at 0:38
Depends on what sort of test you’re performing. If you’ve got static strings, this is very easy to check via regular expressions:
if (/^[56ab]$/.test(item)) {
//-or-
if (/^(foo|bar|baz|fizz|buzz)$/.test(item)) {
doStuff();
} else {
doOtherStuff();
}
If you’ve got a small set of values (string or number), you can use a switch
:
switch
switch (item) {
case 1:
case 2:
case 3:
doStuff();
break;
default:
doOtherStuff();
break;
}
If you’ve got a long list of values, you should probably use an array with ~arr.indexOf(item)
, or arr.contains(item)
:
~arr.indexOf(item)
arr.contains(item)
vals = [1,3,18,3902,...];
if (~vals.indexOf(item)) {
doStuff();
} else {
doOtherStuff();
}
Unfortunately Array.prototype.indexOf
isn’t supported in some browsers. Fortunately a polyfill is available. If you’re going through the trouble of polyfilling Array.prototype.indexOf
, you might as well add Array.prototype.contains
.
Array.prototype.indexOf
Array.prototype.indexOf
Array.prototype.contains
Depending on how you’re associating data, you could store a dynamic list of strings within an object as a map to other relevant information:
var map = {
foo: bar,
fizz: buzz
}
if (item in map) {
//-or-
if (map.hasOwnProperty(item)) {
doStuff(map[item]);
} else {
doOtherStuff();
}
in
will check the entire prototype chain while Object.prototype.hasOwnProperty
will only check the object, so be aware that they are different.
in
Object.prototype.hasOwnProperty
It’s perfectly fine. If you have a longer list of values, perhaps you can use the following instead:
if ([5,6,7,8].indexOf(x) > -1) {
}
– psr
Aug 24 ’12 at 21:40
Yes. You can use your own function. This example uses .some
:
.some
var foo = [ 5, 6 ].some(function(val) {
return val === x;
});
foo; // true
– Adam Templeton
Aug 24 ’12 at 21:20
– Graeck
Apr 16 ’14 at 23:52
This is what I’ve decided to use:
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;
}
You would use it like this:
var fav = 'pear',
fruit = ['apple', 'banana', 'orange', 'pear'],
plu = [4152, 4231, 3030, 4409];
if (fav.isin(fruit, plu, 'eggs', 'cheese')) {
//do something cool
}
The advantages are:
If you don’t want to allow type coercion (indexOf
does not), change the two ==
to ===
. As it stands:
indexOf
==
===
fav = "4231";
plu.indexOf(fav) //-1
fav.isin(plu) //true
no, there might be a few tricks that are case specific but in general i write code like this:
if (someVariable === 1 ||
someVariable === 2 ||
someVariable === 7 ||
someVariable === 12 ||
someVariable === 14 ||
someVariable === 19) {
doStuff();
moreStuff();
} else {
differentStuff();
}
||
to much after 19
– Felix Dombek
Aug 24 ’12 at 21:10
||
19
The simple answer is no. You can use a switch statement, which is easier to read if you are comparing a lot of string values, but using it for two values wouldn’t look any better.
[Edit] this seems to work, but as Dan pointed out, it is actually a false positive. Do not use this method. I leave it here for educational purposes.
Easiest way I know :
a = [1,2,3,4,5];
if(3 in a) alert("true"); // will alert true
Tested in Chrome console. Not sure if it works in other browsers.
3 in [1, 3]
– it will return false
because there is no element with the index 3 in the array [1, 3]
. For that matter, 3 in ['a', 'b', 'c', 'd']
will return true.– Dan Dascalescu
Sep 10 ’15 at 11:21
3 in [1, 3]
false
[1, 3]
3 in ['a', 'b', 'c', 'd']
– Jeremy Thille
Sep 10 ’15 at 15:46
– Alnitak
Aug 24 ’12 at 20:42