Есть ли простой способ создания динамических переменных с помощью Javascript? - PullRequest
17 голосов
/ 10 марта 2010

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

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 ]

33 голосов
/ 10 марта 2010

Это действительно легко сделать: object["variablename"] = whatever;

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

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

5 голосов
/ 10 марта 2010

Если вы собираетесь сделать это, используя объявленный объект, такой как 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 на объектах могут запутаться из-за перечисления свойств прототипа и т. Д.

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

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

alert(landmark0);

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

window.landmarks = [];
landmarks.push(new google.maps.Icon());
// etc...
4 голосов
/ 10 марта 2010

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

> window["myNamedVar"] = "Hello, World!";
> console.log(myNamedVar);
  "Hello, World!"
3 голосов
/ 10 марта 2010

Вам лучше создать объект 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"
1 голос
/ 24 ноября 2012

Вам действительно нужны эти переменные? Вы не можете сделать с этим:

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 на icon + type + .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», например iconhostpital.png, iconchurch.png.

Чтобы использовать значки, напишите landmarks.type, где type - это одно из имен в массиве типов, например, landmarks.hospital.

если имена изображений имеют вид значка + число + .png, а число для каждого типа эквивалентно его индексу в массиве, замените вызов createIcon (type [i]) для createIcon (i).

...