【问题标题】:Alternative to a million IF statements百万 IF 语句的替代方案
【发布时间】:2012-04-19 05:19:22
【问题描述】:

使用 JavaScript,我从网页中提取名称并以某种方式将它们串在一起(可能与数组一起使用)。一旦我把所有的名字收集在一起,我需要创建另一个字符串来给出这些名字的所有电子邮件地址。电子邮件地址不在网页上,因此我必须以某种方式在我的脚本中列出所有可能的 thisName=thisEmail。我正准备用大量的 if 语句来解决这个问题,但我认为必须有一种更有效的方法。有什么建议吗?

var x = getElementById("names");
var name = x.InnerHTML;
var email;
if (name == 'Steve'){ email == 'steve462@gmail.com'; }
if (name == 'Bob'){ email == 'duckhunter89@gmail.com'; }
....

【问题讨论】:

  • 可能是某种数据库?
  • 一百万个案例的switch语句...
  • 根据您提供的有限示例,email 似乎只是名称的小写版本,并在末尾附加了@gmail.com。如果是这种情况,您就不需要任何类型的控制结构。
  • @AnthonyGrist 抱歉,我举了一个不好的例子。这些电子邮件比名字更随机@gmail.com

标签: javascript if-statement


【解决方案1】:

一个 switch 语句,因为您的代码只有 if-elses :-)

不,老实说。最好的办法是找到一个简单的算法来从任何给定名称创建电子邮件地址,例如

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

如果它们相差很大,您可以使用对象作为键值映射:

var mails = {
    "Steve": "steve@gmail.com",
    "Bob": "bob1@freemail.org",
    ...
}
var email = mails[name];

如果您必须确定需要使用哪种算法,您也可以将它们组合起来:

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

或者当它更简单一点时:

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

尽量减少传送给客户的数据量。

【讨论】:

    【解决方案2】:

    您可以将所有电子邮件地址存储在一个关联数组中,例如

    伪代码

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

    【讨论】:

    • 只是这不是一个javascript“关联数组”。
    【解决方案3】:

    你可以提前创建一个对象:

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

    对于您使用的任何语言,使用 JSON 库从某些服务器端语言输出这将是很容易的。本页底部有 JSON 库列表:http://www.json.org/

    如果您在服务器端使用 PHP,您只需 json_encode 一个关联数组,该数组可能是您从数据库中选择的。

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-10
      • 1970-01-01
      • 2014-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多