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.
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.
Share Improve this question asked Aug 21, 2014 at 5:54 NicollNicoll 2571 gold badge5 silver badges17 bronze badges 1- Are you using Jquery as well, or only pure javascript? – disappointed in SO leadership Commented Aug 21, 2014 at 5:59
8 Answers
Reset to default 4Three 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 havetoString
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; }
You may use the array approach like this:
if (["thunderstorm", "fog", "hail", "heavy_snow", "haze", "sleet", "snow"].indexOf(filenameTmp) >= 0) {
You can use the match() method together with a regex
var.match(^(?:apple|pear|whatever)$/)
if (["thunderstorm", "fog", "hail", "heavy_snow", "haze", "sleet", "snow"].indexOf(filenameTmp) !== -1) {
document.getElementById("twilightBG").style.display = "none";
}
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";
}
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
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";
}
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";
}