Domanda

Ho costruito una mappa google data-driven con diverse icone che vengono assegnati alla mappa a seconda del tipo di elemento si trova. Quindi, se ho 5 tipi di punto di riferimento, e ciascuno ottiene un'icona diversa (negozio, biblioteca, ospedale, ecc.) - quello che vorrei fare è generare oggetti sull'icona di Google in modo dinamico. Stavo pensando qualcosa di simile:

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 javascript variabili in modo dinamico. Deve essere js puri, potrei farlo in PHP, ma che non è un'opzione qui.

Grazie!

È stato utile?

Soluzione

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 di essere globale (perché dovreste?) Si può accedere all'oggetto globale direttamente utilizzando window.

Altri suggerimenti

Se avete intenzione di farlo utilizzando un oggetto dichiarato come Landmark["landmark" + i], davvero può anche utilizzare un array indice piuttosto che un associativa, è molto più facile 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 su oggetti in grado di 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 il namespace globale, con molte variabili inutili. Così si sarebbe ancora meglio con una matrice:

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

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

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

Si sarebbe meglio creare un oggetto JavaScript che si può usare un po 'come un array associativo è usato 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"

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

Le modifiche effettuate tenendo conto commento:

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

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 è il seguente: { ospedale: icona, chiesa: icona, ... }

dove icona è una mappa icona di Google che ha un attributo dell'immagine che è una stringa nella forma "icona {} tipo .png", per esempio, iconhostpital.png, iconchurch.png.

Per utilizzare le icone scrivere landmarks.type dove tipo è uno dei nomi nella matrice di tipi, per esempio landmarks.hospital.

se i nomi di immagine sono dell'icona modulo + numero + .png, e il numero di ciascun tipo è equivalente al relativo indice nell'array sostituire il CreateIcon chiamata (tipo [i]) per CreateIcon (i).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top