Alternative to a million IF statements

2019-01-01 09:46发布

问题:

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 == \'steve462@gmail.com\'; }
if (name == \'Bob\'){ email == \'duckhunter89@gmail.com\'; }
....

回答1:

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\": \"steve@gmail.com\",
    \"Bob\": \"bob1@freemail.org\",
    ...
}
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 \"info@\"+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.



回答2:

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

pseudo code

var emailsList = [\"steve\" => \"steve@gmail.com\", \"bob\" => \"bob@gmail.com\"];
then email = emailsList[name]; will solve your problem


回答3:

You could create an object in advance:

var name_email_map = {
 \"Steve\": \"steve@gmail.com\",
 \"Bob\": \"bob@gmail.com\",
 \"John\": \"j7hogli123123@telus.net\"
}

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 bob@gmail.com
alert(name_email_map[\'John\']); // Alerts j7hogli123123@telus.net