Альтернатива миллиону заявлений IF

Используя JavaScript, я вытаскиваю имена из веб-страницы и как-то связываю их вместе (вероятно, используя массив). После того как я соберу все имена вместе, мне нужно создать еще одну строку, в которой будут указаны все адреса электронной почты этих имен. Адреса электронной почты не указаны на веб-странице, поэтому мне придется каким-то образом перечислять все возможные thisName = thisEmail в моем скрипте. Я собирался подойти к этому, сделав несколько миллиардов заявлений, но я подумал, что должен быть более эффективный способ. Какие-либо предложения?

<code>var x = getElementById("names");
var name = x.InnerHTML;
var email;
if (name == 'Steve'){ email == '[email protected]'; }
if (name == 'Bob'){ email == '[email protected]'; }
....
</code>
 vcsjones05 апр. 2012 г., 15:01
Возможно, база данных какой-то?
 Anthony Grist05 апр. 2012 г., 15:03
На основании предоставленного вами ограниченного примераemail кажется просто строчная версия названия с@gmail.com, добавлено до конца. Если это так, вам не нужна какая-либо структура управления.
 T I05 апр. 2012 г., 15:01
заявление переключателя с миллионом случаев ...
 Jonathan Eckman05 апр. 2012 г., 15:23
@AnthonyGrist Извините, я привел плохой пример. Письма более случайны, чем просто имя@gmail.com

Ответы на вопрос(3)

Вы можете хранить все адреса электронной почты в ассоциативном массиве, как

псевдокод

var emailsList = ["steve" => "[email protected]", "bob" => "[email protected]"];
then email = emailsList[name]; will solve your problem
 05 апр. 2012 г., 15:20
только то, что это не «ассоциативный массив» javascript.
 05 апр. 2012 г., 15:21
Я написал это как псевдокод

Вы можете создать объект заранее:

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

Это было бы легко вывести из некоторого серверного языка с библиотекой JSON для любого языка, который вы используете. Ниже приведен список библиотек JSON:http://www.json.org/

Если вы используете PHP на стороне сервера, вы можете просто json_encode ассоциативного массива, который вы, возможно, выбрали из базы данных.

var name = 'Bob'; //x.innerHTML;
var email = name_email_map[name];
alert(email); // Alerts [email protected]
alert(name_email_map['John']); // Alerts [email protected]
Решение Вопроса

Заявление о переключении, так как ваш код только if-elses :-)

Нет честно Лучше всего, если вы найдете простой алгоритм для создания адреса электронной почты с любым именем, например

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

Если они сильно отличаются, вы можете использовать объект в качестве карты значения ключа:

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

Вы также можете объединить их, если вам нужно определить, какой алгоритм вам нужно использовать:

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;
    }

или когда это немного проще:

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;
    }

Просто постарайтесь максимально сократить объем передаваемых клиенту данных.

Ваш ответ на вопрос