JavaScript: Simple way to check if variable is equal to one of two or more values?

JavascriptComparison

Javascript Problem Overview


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

?

Javascript Solutions


Solution 1 - Javascript

You can stash your values inside an array and check whether the variable exists in the array by using [].indexOf:

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

If -1 is returned then the variable doesn't exist in the array.

Solution 2 - Javascript

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 (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):

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.

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.

Solution 3 - Javascript

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) {
}

Solution 4 - Javascript

Yes. You can use your own function. This example uses .some:

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

foo; // true

Solution 5 - Javascript

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:

  • it works in IE < 9;
  • it reads naturally from left to right;
  • you can feed it arrays or separate values.

If you don't want to allow type coercion (indexOf does not), change the two == to ===. As it stands:

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

Solution 6 - Javascript

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();
}

Solution 7 - Javascript

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.

Solution 8 - Javascript

[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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAdam TempletonView Question on Stackoverflow
Solution 1 - JavascriptYoshiView Answer on Stackoverflow
Solution 2 - JavascriptzzzzBovView Answer on Stackoverflow
Solution 3 - JavascriptJoão SilvaView Answer on Stackoverflow
Solution 4 - JavascriptDavid GView Answer on Stackoverflow
Solution 5 - JavascriptGreg PerhamView Answer on Stackoverflow
Solution 6 - JavascriptckozlView Answer on Stackoverflow
Solution 7 - JavascriptmonitorjblView Answer on Stackoverflow
Solution 8 - JavascriptJeremy ThilleView Answer on Stackoverflow