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

问题描述:

我已经建立了一个数据驱动的谷歌地图,根据不同的图标分配到地图,取决于所在物品的类型。因此,如果我有5种类型的地标,并且每个都有不同的图标(商店,图书馆,医院等) - 我想要做的就是动态生成Google图标对象。我在想这样的事情:有没有一种简单的方法来用Javascript创建动态变量?

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); 
    } 

,但它没有工作either--我会很感激的动态生成JavaScript变量的指针。它必须是纯粹的js,我可以在PHP中完成,但这不是一个选项。

谢谢!

+1

+1 - 欢迎来到* :-) – 2010-03-09 23:46:02

+1

JavaScript真的是一种动态语言。你很少需要为这样的事情使用eval语句,因为只要语法是正确的,你大多可以写任何你想要的东西,如果你写的东西不存在,你会得到一个运行时错误。关于javascript的一个好处是window.close与编写窗口[“close”]相同。所以你甚至可以写窗口[“close”]();或var c =“close”;窗口[C](); – Alxandr 2010-03-09 23:48:58

这真的很容易做到:object["variablename"] = whatever;

因此,例如,你可以有一个对象:var Landmarks = {},你可以添加到它,像这样:Landmarks["landmark" + i] = new google.maps.Icon();,并通过这种方式。

如果您需要将这些变量设置为global(为什么?),您可以使用window直接访问全局对象。

+0

谢谢Plynx!这最终为我工作得很好。我很感激帮助。 – julio 2010-03-10 00:48:16

+2

@ julio,Plynx:不知道该怎么说,这听起来不痛苦,但这将是可怕的JavaScript。就像我在我的回答中所说的那样,这就是javascript数组的用处。如果你很乐意这样写你的JavaScript,那么公平,但我认为这会让你更好的编码器,如果你学会了正确的做法:-) – 2010-03-10 08:28:19

+1

+1辉煌的代码..!它救了我..!谢谢。! – writeToBhuwan 2013-05-02 08:22:35

你会更好,创建一个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++; 
} 

它更有意义,这样做的和对象for...in环能有点凌乱与原型的属性是可枚举等

如果你想使一个变量全局,把它添加到窗口对象:

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

alert(landmark0); 

但是这会污染具有许多不必要变量的全局名称空间。所以,你仍然会是一个数组更好:。

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

谢谢安迪 - 我试过你的解决方案,看来你不能将这个对象推到一个数组上。每次尝试时都会出现语法错误。但是,当我这样做时: var icon = new google.maps.Icon(); landmarks.push(icon); 它工作正常。问题就变成了如果我试图使用 地标[i] .image =等 设置其他属性,我会得到一个“地标[i] undefined”有什么想法? – julio 2010-03-10 00:27:36

+0

@ julio:查看MSDN上的推送方法文档 - http://msdn.microsoft.com/en-us/library/6d0cbb1w(VS.85).aspx。确保你的'地标= []'也在循环之外,否则你会不断覆盖它。相信我,你试图达到的是数组存在的原因。 – 2010-03-10 00:48:01

+0

ps - push方法非常有用地返回数组的新长度,因此您可以检查返回的值,以查看您正在推送的数据是否正在进入数组。 – 2010-03-10 00:50:13

就直接回答你的问题(虽然请注意,这是不是你想要的解决检查出其他的答案这仅仅是文档!),这里是从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"; 

所做的修改基于评论:

图标名称模式从图标+指数+改为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 {type} .png”,例如iconhostpital.png,iconchurch.png。

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

如果图像名称的形式为图标+数字+ .png,并且每个类型的数字等于其数组中的索引,请将createIcon(type [i])替换为createIcon(i)的调用createIcon(type [i])。

+0

年龄后,我知道,但澄清此代码将无法正常工作,为什么任何人都需要它复制。 你没有封装你的“for”代码{},所以你最终会得到最终结果,顺便说一句,因为你实际上想追加类型[i]而不是我是for循环中的计数。问题图标中的 – 2015-09-08 13:12:00

+0

的形式为“图标”+ i +“。png“=”icon1.png“,你说想要的表单是”图标“+ types [i] +”pgn“=”iconhostpital.png“关于不保存图标你是对的 – Alfgaar 2017-12-30 03:35:21

+0

我还没有介绍一个完整的解决方案,我很懒,我的意思是,从类型数组中创建图像名称,创建谷歌图标,将图像名称设置为谷歌图标图像属性并使用它,不需要变量标识符是动态定义的。 – Alfgaar 2017-12-30 04:04:20