2010-03-09 19 views
17

Ho creato una mappa google basata sui dati con icone diverse che vengono assegnate alla mappa in base al tipo di elemento individuato. Quindi, se ho 5 tipi di punti di riferimento, e ognuno ha un'icona diversa (negozio, biblioteca, ospedale, ecc.), Quello che mi piacerebbe fare è generare gli oggetti icona di Google in modo dinamico. Stavo pensando qualcosa del genere:C'è un modo semplice per creare variabili dinamiche con Javascript?

types = array('hospital','church','library','store',etc); 
var i=0; 
while (i<=types.length) { 

    var landmark + i = new google.maps.Icon(); 
    landmark.image = "icon" + i + ".png"; 
    i++; 
    } 

tuttavia, come probabilmente avete indovinato, questo non funziona. Ho anche provato ad utilizzare eval, in questo modo:

while (i<=types.length) { 
     doIcon(i); 
     i++; 
    } 

    function doIcon(i){ 
     eval("var landmark" + i + " = new.google.maps.Icon();"); 
     return eval("landmark" + i); 
    } 

, ma non ha funzionato either-- Apprezzerei tutti i puntatori sulla generazione di variabili JavaScript in modo dinamico. Deve essere puro js, ​​potrei farlo in PHP ma non è un'opzione qui.

Grazie!

+1

+1 - Benvenuti in StackOverflow :-) –

+1

JavaScript è davvero un linguaggio dinamico. Raramente hai bisogno di usare l'istruzione eval per cose come questa, perché puoi scrivere principalmente quello che vuoi purché la sintassi sia corretta, e se ciò che hai scritto non esiste, otterrai un errore di runtime. Una cosa carina di javascript è l'abilità che window.close è la stessa della finestra di scrittura ["chiudi"]. Quindi puoi anche scrivere una finestra ["close"](); o var c = "close"; finestra [c](); – Alxandr

risposta

33

E 'davvero facile da fare: object["variablename"] = whatever;

Così, per esempio si potrebbe avere un oggetto: var Landmarks = {} e si potrebbe aggiungere ad essa in questo modo: Landmarks["landmark" + i] = new google.maps.Icon(); e passare in questo modo.

Se avete bisogno di queste variabili siano globale (perché dovreste?) Si può accedere all'oggetto globale direttamente utilizzando window.

+0

Grazie Plynx! Questo ha finito per funzionare bene per me. Apprezzo l'aiuto. – julio

+2

@julio, Plynx: Non sai come dirlo senza sembrare amaro, ma sarebbe un javascript terribile. Come ho detto nella mia risposta, questa cosa è ciò che gli array javascript sono per. Se sei felice di scrivere il tuo javascript in questo modo, allora è abbastanza giusto, ma penso che ti renderebbe un programmatore migliore se hai imparato a farlo nel modo corretto :-) –

+1

+1 Codice brillante ..! Mi ha salvato ..! Grazie.! – writeToBhuwan

3

Faresti meglio creare un oggetto JavaScript che si può usare un po 'come un array associativo viene utilizzato in PHP:

var types = ['hospital','church','library','store']; 
var landmarks= {}; 
for (var i in types) { 
    landmarks[types[i]]= new google.maps.Icon(); 
    landmarks[types[i]].image = "icon" + i + ".png"; 
} 
alert(landmarks['hospital'].image); // displays "icon0.png" 
5

Se avete intenzione di farlo utilizzando un oggetto dichiarato come Landmark["landmark" + i] , si può anche usare un array di indici piuttosto che associativo, è molto più semplice per l'iterazione. Gli oggetti non sono realmente utilizzati con proprietà indicizzate perché Array fanno un lavoro molto migliore di esso:

var myObj =   // object version 
{ 
    "item0": "blah", 
    "item1": "blah" 
    // etc 
} 
var myArr =   // array version 
[ 
    "blah", 
    "blah" 
    // etc 
] 

Molto più sensato utilizzare la matrice:

landmarks = []; // new array 
types = array('hospital','church','library','store',etc); 
var i=0; 
while (i<=types.length) { 
    landmarks.push(new google.maps.Icon()); 
    landmarks[i].image = "icon" + i + ".png"; 
    i++; 
} 

Ha più senso per farlo in quel modo e for...in loop sugli oggetti possono ottenere un po 'confuso con proprietà la creazione del prototipo di essere enumerabile, ecc

Se stai cercando di fare un variabile globale, aggiungerlo all'oggetto finestra:

var myCustomVar = "landmark" + i; 
window[myCustomVar] = new google.maps.Icon(); 

alert(landmark0); 

Ma questo sarebbe inquinare lo spazio dei nomi globale con molte variabili non necessarie. Quindi saresti ancora meglio con una matrice:..

window.landmarks = []; 
landmarks.push(new google.maps.Icon()); 
// etc... 
+0

grazie Andy-- Ho provato la tua soluzione, e sembra che tu non possa spingere questo oggetto su un array. Ho riscontrato un errore di sintassi ogni volta che ho provato. Tuttavia, quando l'ho fatto in questo modo: var icon = new google.maps.Icon(); landmarks.push (icona); ha funzionato bene. il problema è diventato che avrei ottenuto un "punto di riferimento [i] indefinito" se provassi a impostare gli altri attributi usando punti di riferimento [i] .image = ecc. Qualche idea? – julio

+0

@julio: dai un'occhiata al documento metodo push su MSDN - http://msdn.microsoft.com/en-us/library/6d0cbb1w(VS.85).aspx. Assicurati che il tuo 'landmarks = []' sia fuori dal ciclo, altrimenti lo sovrascrivi continuamente. Fidati di me, quello che stai cercando di ottenere è la ragione per cui esistono gli array. –

+0

ps - il metodo push restituisce in modo molto utile la nuova lunghezza dell'array, quindi è possibile controllare il valore restituito per vedere se ciò che si sta spingendo lo sta facendo nell'array. –

4

Proprio per rispondere alla tua domanda direttamente (anche se si ricorda che questa non è la soluzione che si desidera controllare le altre risposte Questo è solo per la documentazione!), ecco un copia-incolla da una console JavaScript:

> window["myNamedVar"] = "Hello, World!"; 
> console.log(myNamedVar); 
    "Hello, World!" 
1

avete veramente bisogno di tali variabili?Non si può fare con questo:

var types = ['hospital','church','library','store'];  
for(var i =0; i < types.length; i += 1) (new google.maps.Icon()).image = "icon" + i + ".png"; 

modifiche fatte sulla base di commento:

nome dell'icona modello cambiato da icona + indice + .png sulle icone + tipo + .png e salvare i risultati del ciclo continuo.

types = ['hospital','church','library','store']; 
var landmarks = {}; 


// images names are of the form icon + type + .png 
function createIcon(type) 
{ 
    var icon = new google.maps.Icon(); 
    icon.image = "icon" + type + ".png"; 
    return icon; 
} 

// mapping of landamarks by type and icon 
for (var i = 0, len = types.length; i < len; i++) 
{ 
    landmarks[types[i]] = createIcon(types[i]); 
} 

il risultato è: { ospedale: icona, chiesa: icona, ...}

cui icona è una mappa icona di Google che ha un attributo dell'immagine che è una stringa di la forma "icona {tipo} .png", ad es. iconhostpital.png, iconchurch.png.

Per utilizzare le icone scrivere landmarks.type dove il tipo è uno i nomi nell'array di tipi, ad es. landmarks.hospital.

se i nomi di immagine sono dell'icona di modulo + numero + .png e il numero per ogni tipo è equivalente al suo indice nell'array sostituire la chiamata createIcon (tipo [i]) per createIcon (i).

+0

Età dopo che so ma per chiarire questo codice non funzionerà così com'è e perché in caso qualcuno lo prende per copiare. Non hai incapsulato il tuo codice "for" code {} in modo da finire con il risultato finale, che incidentalmente sarebbe icon3.png perché in realtà volevi aggiungere tipi [i] not i che è il conteggio nel ciclo for . –

+0

nelle icone delle domande sono del tipo "icona" + i + ".png "=" icon1.png ", tu dici che la forma ricercata è" icona "+ tipi [i] +" pgn "=" iconhostpital.png ". Riguardo al non salvare l'icona hai ragione, – Alfgaar

+0

non ho presentato una soluzione completa, ero pigro, volevo dire, costruire il nome dell'immagine dalla serie di tipi, creare l'icona di google, impostare il nome dell'immagine sull'attributo dell'immagine icona di google e usarlo, non c'è bisogno di una variabile identificatore di cui è definito dinamicamente. – Alfgaar

Problemi correlati