Существует ли простой способ создать динамические переменные с JavaScript?

Я создал управляемую данными карту Google с различными значками, которые присвоены карте в зависимости от типа расположенного объекта. Таким образом, если у меня есть 5 типов ориентира, и каждый получает различный значок (хранилище, библиотека, больница, и т.д.) - что я хотел бы сделать, генерируют объекты значка Google динамично. Я думал что-то вроде этого:

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

однако, как Вы, вероятно, предположили, это не работает. Я также пытался использовать оценку, как это:

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

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

но это не работало ни один - я буду ценить любые указатели при генерации переменных JavaScript динамично. Это получено, чтобы быть чистым js, я мог сделать это в PHP, но это не опция здесь.

Спасибо!

17
задан julio 9 March 2010 в 23:28
поделиться

4 ответа

Это действительно легко сделать: объект ["имя переменной"] = все;

Так, например, у вас может быть объект: var Landmarks = {} , и вы можете добавить к нему так: Landmarks ["ориентир" + i] = new google.maps.Icon (); и передать его таким образом.

Если вам нужно, чтобы эти переменные были глобальными (зачем?), Вы можете получить доступ к глобальному объекту напрямую, используя окно .

33
ответ дан 30 November 2019 в 10:58
поделиться

Если вы собираетесь сделать это с использованием объявленного объекта, такого как Landmark ["ориентир" + i] , вы действительно можете также используйте индексный массив, а не ассоциативный, это намного проще для итерации. Объекты на самом деле не используются с индексированными свойствами, потому что массивы справляются с этим гораздо лучше:

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

Намного разумнее использовать массив:

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

Более разумно делать это таким образом и для ... in циклы на объектах могут немного запутаться, поскольку прототипы свойств могут быть перечисляемыми и т. д.

Если вы пытаетесь сделать переменную глобальной, добавьте ее к объекту окна:

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

alert(landmark0);

Но это будет загрязнять глобальное пространство имен со множеством ненужных переменных. Так что вам все равно будет лучше с массивом:

window.landmarks = [];
landmarks.push(new google.maps.Icon());
// etc...
5
ответ дан 30 November 2019 в 10:58
поделиться

Просто чтобы напрямую ответить на ваш вопрос (хотя обратите внимание, что это не то решение, которое вам нужно. Ознакомьтесь с другими ответами. Это только для документации! ), вот копипаст из JavaScript консоль:

> window["myNamedVar"] = "Hello, World!";
> console.log(myNamedVar);
  "Hello, World!"
4
ответ дан 30 November 2019 в 10:58
поделиться

Лучше создать объект javascript, который можно использовать примерно так, как в 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"
3
ответ дан 30 November 2019 в 10:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: