有没有一种简单的方法可以用Javascript创建动态变量?

有没有一种简单的方法可以用Javascript创建动态变量?,javascript,dynamic-variables,Javascript,Dynamic Variables,我已经建立了一个数据驱动的谷歌地图,它有不同的图标,这些图标根据所定位的项目类型分配给地图。因此,如果我有5种类型的地标,每种都有一个不同的图标(商店、图书馆、医院等)——我想做的是动态生成google图标对象。我是这样想的: types = array('hospital','church','library','store',etc); var i=0; while (i<=types.length) { var landmark + i = new google.maps.

我已经建立了一个数据驱动的谷歌地图,它有不同的图标,这些图标根据所定位的项目类型分配给地图。因此,如果我有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);
    }
types=数组(“医院”、“教堂”、“图书馆”、“商店”等);
var i=0;

而(i这真的很容易做到:
object[“variablename”]=which;

例如,您可以有一个对象:
var-Landmarks={}
您可以这样添加到它:
Landmarks[“landmark”+i]=new google.maps.Icon();
并以这种方式传递它


如果您需要这些变量是全局的(为什么要?),您可以使用
窗口直接访问全局对象
您最好创建一个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"

如果要使用已声明的对象(如
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++;  
}
但这会用许多不必要的变量污染全局名称空间。因此,使用数组仍然会更好:

window.landmarks = [];
landmarks.push(new google.maps.Icon());
// etc...

为了直接回答您的问题(尽管请注意,这不是您想要的解决方案。请查看其他答案。这只是文档!),下面是JavaScript控制台的复制粘贴:

> window["myNamedVar"] = "Hello, World!";
> console.log(myNamedVar);
  "Hello, World!"

你真的需要这些变量吗?你不能这样做:

var types = ['hospital','church','library','store'];    
for(var i =0; i < types.length; i += 1) (new google.maps.Icon()).image = "icon" + i + ".png";
var-types=['hospital'、'church'、'library'、'store'];
对于(var i=0;i
根据评论进行的修改:

图标名称模式从图标+索引+.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]);
}
types=[‘医院’、‘教堂’、‘图书馆’、‘商店’];
var-landmarks={};
//图像名称的格式为icon+type+.png
函数createIcon(类型)
{ 
var icon=new google.maps.icon();
icon.image=“icon”+type+”.png”;
返回图标;
}
//按类型和图标绘制landamarks地图
对于(变量i=0,len=types.length;i
结果是: { 医院:图标, 教堂:偶像, ... }

其中icon是一个谷歌地图图标,其图像属性为“icon{type}.png”格式的字符串,例如iconhostpital.png、iconchurch.png

要使用图标,请写入
landmarks.type
,其中type是类型数组中的名称之一,例如
landmarks.hospital


如果图像名称的格式为icon+number+.png,并且每种类型的数字都相当于其在数组中的索引,则替换createIcon(i)的调用createIcon(type[i])。

+1-欢迎使用StackOverflow:-)JavaScript确实是一种动态语言。对于这样的事情,您很少需要使用eval语句,因为只要语法正确,您基本上可以编写任何您想要的内容,如果您编写的内容不存在,您将得到一个运行时错误。javascript的一个优点是window.close与编写window[“close”]的功能相同。所以你甚至可以写window[“close”]();或var c=“关闭”;窗口[c]();谢谢Andy--我尝试了你的解决方案,但似乎你无法将此对象推送到数组上。我每次尝试都会遇到语法错误。然而,当我这样做时:var icon=new google.maps.icon();地标。按下(图标);它工作得很好。问题是,如果我尝试使用landmarks[I].image=等设置其他属性,我会得到一个“landmark[I]undefined”。有什么想法吗?@julio:看看MSDN-上的推送方法文档。确保您的
landmarks=[]
也在循环之外,否则您会不断地覆盖它。相信我,你试图实现的是array exist.ps的原因-push方法非常有用地返回数组的新长度,因此你可以检查返回的值,看看你所推的是否进入数组。我知道的聚会很晚了,但假设你的评论中没有输入错误:“landmark[I]undefined”如果我尝试使用地标[I].image=等设置其他属性,有什么想法吗?可能是因为你的阵列是地标而不是地标…谢谢Plynx!这对我来说效果很好。我很感激你的帮助。@julio,Plynx:我不知道怎么说才不会听起来很痛苦,但这会很糟糕。正如我在回答中所说,这正是javascript数组的用途。如果你很乐意这样写你的javascript,那就很公平了,但我认为如果你学会了正确的方法,你会成为一个更好的程序员:-)我知道很多年后,但澄清一下,这段代码不会按原样工作,以及为什么有人会复制它。你没有封装你的“for”代码{},所以你只会得到最终的结果,顺便说一句,就是icon3.png,因为你实际上想在for循环中附加类型[i]而不是i,i是计数。在这个问题中,图标的形式是“icon”+i+“.png”=“icon1.png”,你说想要的形式是“icon”+types[i]+“pgn”=“iconhostpital.png”。关于不保存图标,你是对的。我没有提出一个完整的解决方案,我很懒。我的意思是,从类型数组中构建图像名称,创建google图标,将图像名称设置为google图标图像属性并使用它。不需要动态定义标识符的变量。
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]);
}