Reputation: 257
This code works:
if ((filenameTmp == "thunderstorm") ||
(filenameTmp == "fog") ||
(filenameTmp == "hail") ||
(filenameTmp == "heavy_snow") ||
(filenameTmp == "rain") ||
(filenameTmp == "sleet") ||
(filenameTmp == "snow"))
{ document.getElementById("twilightBG").style.display = "none"; }
However I would like to shorten it, I thought this would work but it doesn't.
if(filenameTmp.indexOf ("thunderstorm", "fog", "hail", "heavy_snow", "haze", "sleet", "snow")> -1)
{ document.getElementById("twilightBG").style.display = "none"; }
It does work if I only have a single search like this:
if(filenameTmp.indexOf ("haze")> -1)
{ document.getElementById("twilightBG").style.display = "none"; }
How can I do it searching for multiple instances? Or is there a better way? Thanks.
Upvotes: 5
Views: 7548
Reputation: 648
You can use the match() method together with a regex
var.match(^(?:apple|pear|whatever)$/)
Upvotes: 4
Reputation: 1051
The check would be cleaner if the contains method were added to Array.prototype directly:
Array.prototype.contains = function(obj) { return this.indexOf(obj) > -1; };
This allows the check to be:
if (['thunderstorm', 'fog', 'hail', 'heavy_snow', 'rain', 'sleet', 'snow'].contains(filenameTmp)) {
document.getElementById("twilightBG").style.display = "none";
}
Upvotes: 2
Reputation: 21
You can use regx:
if (filenameTmp.match(/^(thunderstorm|fog|hail|heavy_snow|rain|sleet|snow)$/)) {
document.getElementById("twilightBG").style.display = "none";
}
or array of js 5:
if (['thunderstorm', 'fog', 'hail', 'heavy_snow','rain','sleet','snow'].indexOf(filenameTmp) >= 0) {
document.getElementById("twilightBG").style.display = "none";
}
or inArray method of Jquery:
if ($.inArray(filenameTmp, ['thunderstorm', 'fog', 'hail', 'heavy_snow','rain','sleet','snow']) >= 0) {
document.getElementById("twilightBG").style.display = "none";
}
Upvotes: 1
Reputation: 1074138
Three options for you:
A map object
An array lookup
switch
Details:
You can use a lookup map object:
// In a common declarations area
var weather = {
"thunderstorm": true,
"fog": true,
"hail": true,
"heavy_snow": true,
"rain": true,
"sleet": true,
"snow": true
};
// Where you want the check
if (weather[filenameTmp]) {
document.getElementById("twilightBG").style.display = "none";
}
Note that you can do that inline if you like:
if ({ "thunderstorm": true, "fog": true, "hail": true, "heavy_snow": true, "rain": true, "sleet": true, "snow": true }[filenameTmp]) {
document.getElementById("twilightBG").style.display = "none";
}
Note that if filenameTmp
has the value "toString"
, "valueOf"
, or similar, you'll get false-positives from that. If you're using a true ES5-enabled engine, you can get pure maps (objects that don't have toString
and such) by using a builder function:
function pureMap(props) {
var o = Object.create(null);
var key;
if (props) {
for (key in props) {
o[key] = props[key];
}
}
return o;
}
Then:
// In a common declarations area
var weather = pureMap({
"thunderstorm": true,
"fog": true,
"hail": true,
"heavy_snow": true,
"rain": true,
"sleet": true,
"snow": true
});
// Where you want the check
if (weather[filenameTmp]) {
document.getElementById("twilightBG").style.display = "none";
}
Or you could use an array, but the search is linear whereas browsers can optimize the map lookup above:
// In a common declarations area
var weather = [
"thunderstorm",
"fog",
"hail",
"heavy_snow",
"rain",
"sleet",
"snow"
];
// Where you want the check
if (weather.indexOf(filenameTmp) !== -1) {
document.getElementById("twilightBG").style.display = "none";
}
And again, that can be inline:
if ([ "thunderstorm", "fog", "hail", "heavy_snow", "rain", "sleet", "snow" ].indexOf(filenameTmp) !== -1) {
document.getElementById("twilightBG").style.display = "none";
}
There's also the switch
option:
switch (filenameTmp) {
case "thunderstorm":
case "fog":
case "hail":
case "heavy_snow":
case "rain":
case "sleet":
case "snow":
document.getElementById("twilightBG").style.display = "none";
break;
}
Upvotes: 4
Reputation: 6336
For a bleeding edge solution use Set. Keep in mind it's not currently supported on Opera and Safari:
var weather = new Set();
weather.add("thunderstorm");
weather.add("fog");
weather.add("hail");
weather.add("heavy_snow");
weather.add("rain");
weather.add("sleet");
weather.add("snow");
if (weather.has(filenameTmp)) {
document.getElementById("twilightBG").style.display = "none";
}
Upvotes: 1
Reputation: 1371
Use Array and loop through every entry . this is most efficient way .By this it ll not loop thru all entry once it encounter any one.
function containsAny(str, substrings) {
for (var i = 0; i != substrings.length; i++) {
var substring = substrings[i];
if (str == substring) {
return true;
}
}
return null;
}
var result = containsAny(filenameTmp, ["thunderstrom", "rain"]); // add values you want
if (result) {
document.getElementById("twilightBG").style.display = "none";
}
Hope this helps
Upvotes: 1
Reputation: 6336
if (["thunderstorm", "fog", "hail", "heavy_snow", "haze", "sleet", "snow"].indexOf(filenameTmp) !== -1) {
document.getElementById("twilightBG").style.display = "none";
}
Upvotes: 3
Reputation: 172398
You may use the array approach like this:
if (["thunderstorm", "fog", "hail", "heavy_snow", "haze", "sleet", "snow"].indexOf(filenameTmp) >= 0) {
Upvotes: 4