Есть ли простой способ создания динамических переменных с помощью Javascript?
Я построил карту google, управляемую данными, с различными значками, которые назначаются карте в зависимости от типа расположенного элемента. Поэтому, если у меня есть 5 типов ориентиров, и каждый получает другой значок (магазин, библиотека, больница и т. д.) -- то, что я хотел бы сделать, это динамически генерировать объекты значков google. Я думал что-то вроде этого:--3-->
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++;
    } 
однако, как вы, вероятно, догадались, это не работает. Я также попытался использовать eval, например:
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, но это не вариант здесь.
спасибо!
5 ответов
это действительно легко сделать:object["variablename"] = whatever;
так, например, у вас может быть объект:var Landmarks = {} и вы можете добавить к нему так:Landmarks["landmark" + i] = new google.maps.Icon(); и передать его таким образом.
Если вам нужно, чтобы эти переменные были глобальные (зачем?) можно получить доступ к глобальному объекту напрямую, используя window.
если вы собираетесь сделать это с помощью заявленного объекта, такие как Landmark["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++;  
}
имеет смысл сделать это таким образом и for...in петли на предметах может получить немного грязный с прототипом свойств перечислимого, так далее.
если вы пытаетесь сделать переменную глобальной, добавьте ее в объект window:
var myCustomVar = "landmark" + i;
window[myCustomVar] = new google.maps.Icon();
alert(landmark0);
но это будет загрязнять глобальное пространство имен многими ненужными переменными. Таким образом, вы все равно будете лучше с массивом:
window.landmarks = [];
landmarks.push(new google.maps.Icon());
// etc...
просто ответить на ваш вопрос прямо (хотя обратите внимание, что это не решение, которое вы хотите. Проверьте другие ответы. Это только для документации!), вот копия-вставка из консоли JavaScript:
> window["myNamedVar"] = "Hello, World!";
> console.log(myNamedVar);
  "Hello, World!"
вам лучше создать объект 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"
вам действительно нужны эти переменные? Не можете ли вы сделать с этим:
var types = ['hospital','church','library','store'];    
for(var i =0; i < types.length; i += 1) (new google.maps.Icon()).image = "icon" + i + ".png";
изменения, сделанные на основе комментария:
шаблон имени значка изменен с icon + index + .png в значок + тип + .формат PNG и сохранение результатов цикла.
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]);
}
результат : { больница : значок, храмовая икона, ... }
где icon-это значок карты google, который имеет атрибут изображения, представляющий собой строку формы " icon{type}.png", e.g, iconhostpital.формат PNG, iconchurch.формат PNG.
чтобы использовать значки, напишите landmarks.type где type-одно из имен в массиве типов, например landmarks.hospital.
если имена изображений имеют значок формы + номер + .png, а число для каждого типа эквивалентно его индексу в массиве заменить вызов createIcon(type[i]) для createIcon (i).