Nicoll
Nicoll

Reputation: 257

How to search string for multiple values?

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

Answers (8)

Luca B.
Luca B.

Reputation: 648

You can use the match() method together with a regex

var.match(^(?:apple|pear|whatever)$/)

Upvotes: 4

Tapaswi Panda
Tapaswi Panda

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

codeyu
codeyu

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

T.J. Crowder
T.J. Crowder

Reputation: 1074138

Three options for you:

  1. A map object

  2. An array lookup

  3. switch

Details:

  1. 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";
    }
    
  2. 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";
    }
    
  3. 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

Amit Portnoy
Amit Portnoy

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

Khaleel
Khaleel

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

Amit Portnoy
Amit Portnoy

Reputation: 6336

if (["thunderstorm", "fog", "hail", "heavy_snow", "haze", "sleet", "snow"].indexOf(filenameTmp) !== -1) {
document.getElementById("twilightBG").style.display = "none";
}

Upvotes: 3

Rahul Tripathi
Rahul Tripathi

Reputation: 172398

You may use the array approach like this:

if (["thunderstorm", "fog", "hail", "heavy_snow", "haze", "sleet", "snow"].indexOf(filenameTmp) >= 0) {

Upvotes: 4

Related Questions