Alternative to a million IF statements

Using JavaScript I am pulling names out of webpage and stringing them together somehow (probably going with an array). Once I gather all the names together I need to make another string that gives all the email addresses of the names. The email addresses are not on the webpage so I will have to list every possible thisName=thisEmail in my script somehow. I was about to approach this with making a bazillion if statements but I thought there has to be a more efficient way. Any suggestions?

var x = getElementById("names");
var name = x.InnerHTML;
var email;
if (name == 'Steve'){ email == '[email protected]'; }
if (name == 'Bob'){ email == '[email protected]'; }
....

Answers:

Answer

A switch statement, as your code is only if-elses :-)

No, honestly. The best thing would be if you'd find a simple algorithm to create an email address from any given name, like

function mail(name) {
    return name.toLowerCase() + "@gmail.com";
}
var email = mail("Bob") // example usage

If they differ to much, you might use an object as a key-value-map:

var mails = {
    "Steve": "[email protected]",
    "Bob": "[email protected]",
    ...
}
var email = mails[name];

You could also combine those, if you have to determine which algorithm you need to use:

var map = [{
    algorithm: function(name) { return name+"@something"; },
    names: ["Steve", "Bob", ...]
},{
    algorithm: function(name) { return "[email protected]"+name+".org"; },
    names: ["Mark", ...]
}];
for (var i=0; i<map.length; i++)
    if (map[i].names.indexOf(name) > -1) {
        var email = map[i].algorithm(name);
        break;
    }

or when it is a bit simpler:

var domains = {
    "gmail.com": ["Steve", "Bob", ...],
    "free.xxx": ["Mark", ...],
    ...
};
for (var domain in domains)
    if (domains[domain].indexOf(name) > -1)
        var email = name.toLowerCase()+"@"+domain;
        break;
    }

Just try to reduce the amount of data to deliver to the client as much as you can.

Answer

You can store all the email address in an associative array like

pseudo code

var emailsList = ["steve" => "[email protected]", "bob" => "[email protected]"];
then email = emailsList[name]; will solve your problem
Answer

You could create an object in advance:

var name_email_map = {
 "Steve": "[email protected]",
 "Bob": "[email protected]",
 "John": "[email protected]"
}

This would be easy to output from some server side language with a JSON library for whatever language you're using. There is a list of JSON libraries at the bottom of this page: http://www.json.org/

If you're using PHP on the server side you can just json_encode an associative array, which you may have selected from a database.

var name = 'Bob'; //x.innerHTML;
var email = name_email_map[name];
alert(email); // Alerts [email protected]
alert(name_email_map['John']); // Alerts [email protected]

Tags

Recent Questions

Top Questions

Home Tags Terms of Service Privacy Policy DMCA Contact Us Javascript

©2020 All rights reserved.