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