Я создал управляемую данными карту 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, но это не опция здесь.
Спасибо!
Это действительно легко сделать: объект ["имя переменной"] = все;
Так, например, у вас может быть объект: var Landmarks = {}
, и вы можете добавить к нему так: Landmarks ["ориентир" + i] = new google.maps.Icon ();
и передать его таким образом.
Если вам нужно, чтобы эти переменные были глобальными (зачем?), Вы можете получить доступ к глобальному объекту напрямую, используя окно
.
Если вы собираетесь сделать это с использованием объявленного объекта, такого как 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...
Просто чтобы напрямую ответить на ваш вопрос (хотя обратите внимание, что это не то решение, которое вам нужно. Ознакомьтесь с другими ответами. Это только для документации! ), вот копипаст из 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"