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

jul*_*lio 17 javascript dynamic-variables

我已经构建了一个数据驱动的谷歌地图,其中包含不同的图标,这些图标会根据项目的类型分配给地图.因此,如果我有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++;
    } 
Run Code Online (Sandbox Code Playgroud)

然而,正如你可能已经猜到的那样,这不起作用.我也试过使用eval,像这样:

while (i<=types.length) {
        doIcon(i);
        i++;
    }   

    function doIcon(i){ 
        eval("var landmark" + i + " = new.google.maps.Icon();");
        return eval("landmark" + i);
    }
Run Code Online (Sandbox Code Playgroud)

但它也没有用 - 我很感激任何关于动态生成javascript变量的指针.它必须是纯粹的js,我可以用PHP来做,但这不是一个选项.

谢谢!

Ply*_*ynx 33

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

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

如果您需要这些变量是全局的(为什么会这样?),您可以直接使用这些变量访问全局对象window.

  • @julio,Plynx:不知道怎么说这个没有听起来很苦,但这将是可怕的javascript.就像我在回答中说的那样,这就是javascript数组的用途.如果你很乐意写这样的javascript然后公平,但我认为如果你学会了正确的方法,它会让你成为一个更好的编码器:-) (2认同)

And*_*y E 5

如果你要使用声明的对象来做它Landmark["landmark" + i],你真的可以使用索引数组而不是关联数,这对于迭代来说要容易得多.对象并没有真正用于索引属性,因为Arrays做得更好:

var myObj =           // object version
{
   "item0": "blah",
   "item1": "blah"
   // etc
}
var myArr =           // array version
[
   "blah",
   "blah"
   // etc
]
Run Code Online (Sandbox Code Playgroud)

使用数组更明智:

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++;  
}
Run Code Online (Sandbox Code Playgroud)

这样做更有意义,for...in对象上的循环可能会因为可枚举的原型属性而变得有点混乱等.

如果您尝试将变量设为全局变量,请将其添加到窗口对象:

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

alert(landmark0);
Run Code Online (Sandbox Code Playgroud)

但这会使用许多不必要的变量来污染全局命名空间.所以你对数组仍然会更好:

window.landmarks = [];
landmarks.push(new google.maps.Icon());
// etc...
Run Code Online (Sandbox Code Playgroud)