2012-04-05 15 views
8

Uso di JavaScript Sto estraendo i nomi dalla pagina Web e li unisco in qualche modo (probabilmente con un array). Una volta riuniti tutti i nomi, ho bisogno di creare un'altra stringa che fornisca tutti gli indirizzi email dei nomi. Gli indirizzi e-mail non sono nella pagina Web, quindi dovrò elencare tutti i possibili thisName = thisEmail nel mio script in qualche modo. Stavo per avvicinarmi a questo facendo un bazillion se le affermazioni, ma ho pensato che ci deve essere un modo più efficiente. Eventuali suggerimenti?Alternativa a un milione di istruzioni IF

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

Forse un database di qualche tipo? – vcsjones

+0

un'istruzione switch con un milione di casi ... –

+2

In base all'esempio limitato che hai fornito, 'email' sembra essere solo la versione minuscola del nome con' @ gmail.com', aggiunta alla fine. In questo caso, non è necessario alcun tipo di struttura di controllo. –

risposta

15

Una dichiarazione switch, come il codice è solo se-elses :-)

No, onestamente. La cosa migliore sarebbe se si può trovare un semplice algoritmo per creare un indirizzo di e-mail da un dato nome, come

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

Se differiscono a molto, si potrebbe utilizzare un oggetto come un valore-chiave mappa:

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

si potrebbe anche combinare questi, se è necessario determinare quale algoritmo è necessario utilizzare:

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

o quando è un po 'più semplice:

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

Basta provare a ridurre la quantità di dati da consegnare al cliente il più possibile.

1

È possibile memorizzare tutti gli indirizzi di posta elettronica in un array associativo come

pseudo codice

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

solo che questo non è un" array associativo "javascript. – Bergi

+0

L'ho scritto come pseudo codice –

1

Si potrebbe creare un oggetto in anticipo:

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

Questo sarebbe facile uscita da qualche lingua lato server con una libreria JSON per qualsiasi lingua tu stia utilizzando. C'è una lista di librerie JSON in fondo a questa pagina: http://www.json.org/

Se stai usando PHP sul lato server puoi solo json_encode un array associativo, che potresti aver selezionato da un 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] 
Problemi correlati