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
?
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.
Alternativeley, as devmaleeq suggested in the comments, this more concise notation is possible since ES2016:
if ([5, 6].includes(x)) {
// ...
}
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.['a','b'].includes('a')
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.
Yes. You can use your own function. This example uses .some
:
var foo = [ 5, 6 ].some(function(val) {
return val === x;
});
foo; // true
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:
fav = "4231";
plu.indexOf(fav) //-1
fav.isin(plu) //true
[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.
indexOf
, or you can also use a regex/^(New York|Austin|Alberta)$/.test(x)
.