Javascript:从字符串初始化变量?

时间:2012-06-26 16:35:04

标签: javascript arrays string google-maps variables

我正在Google地图中工作并创建了三个+平铺叠加层。一个例子:

平铺叠加

var parkingOptions = {                     //Parking Overlay
    getTileUrl: function(coord, zoom) {
        return "/maps/tiles/tilesparking/" + zoom + "_" + coord.x + "_" + coord.y + ".png";
    },
    tileSize: new google.maps.Size(256, 256)
};

var parkingMapType = new google.maps.ImageMapType(parkingOptions);

但是,为了避免在我的映射范围之外丢失tile而导致404错误,我的代码更复杂一些;因此,我打算制作一个循环,其中分配给每个覆盖的特定关键字(此处称为“停车”)将被插入到上述代码中。因此:

For Loop

var tileNames = ["base", "parking", "access"];

for (var i = 0; i < tileNames.length; i++) {
    //insert Tile Overlay code here
};

但是,我有一个特殊的问题:我找不到从tileNames数组中获取字符串的方法,并使用它们来初始化Tile Overlay代码中的两个变量。理想情况下,我想实现这样的目标:

尝试1

var tileNames[1] + "Options" = {  //ideally: var parkingOptions = {
    //insert remaining code
};

然而,这不起作用,我也没想到。也不会尝试创建那些完整的字符串并尝试将其插入初始化:

尝试2

var newOptions = tileNames[1] + "Options";
var newOptions = {
    //insert remaining code
};

因此,有没有办法将字符串放入初始化变量?


注意:我已将我自己的替代解决方案作为答案包含在内。它应该工作,但它会破坏变量的名称并用一个非描述的数组变量替换它。我最好保留一个描述性变量名称,因为它们经常用于在结果代码中添加和隐藏叠加层。


解决方案 对于这个问题无论如何......

var tileNames = ["beloit", "parking", "access"];
var mapType = {};

for (var i = 0; i < tileNames.length; i++) {
    var tileOptions = {
        getTileUrl: function(coord, zoom) {
            return "/maps/tiles/tiles" + tileNames[i] + "/" + zoom + "_" + coord.x + "_" + coord.y + ".png";
        },
        tileSize: new google.maps.Size(256, 256)
    };
    mapType[tileNames[i]] = new google.maps.ImageMapType(tileOptions);
};

难题的另一部分,getTileUrl函数中的“tileNames [i]”是未定义的,因为函数在执行时需要它而不是将名称字符串放入函数中;但是,这是一个新问题:Javascript: Making a variable static when defining a function in a loop?

4 个答案:

答案 0 :(得分:1)

现在,我不知道以上是否确实可能(我会更喜欢它,我将在下面解释),但在起草这个问题时,其他各种Q /预先阅读的AI开始变得更有意义。他们的一般信息是:“使用数组”:

可能的解决方案 (已编辑;现在应该可以使用。)

var tileNames = ["beloit", "parking", "access"];  //Would be used more than once.
var tileMapType = [];

for (var i = 0; i < tileNames.length; i++) {
    var tileOptions = {
        getTileUrl: function(coord, zoom) {
            return "/maps/tiles/tiles"+tileNames[i]+"/" + zoom + "_" + coord.x + "_" + coord.y + ".png";
        },
        tileSize: new google.maps.Size(256, 256)
    };
    tileMapType[i] = new google.maps.ImageMapType(tileOptions);
};

这种方法的唯一问题是,在下面的代码中,我必须将这些MapType放入地图中,并将它们切换为可见和不可见,并使用非描述tileMapType [x]这样做会妨碍整体可读性。 (也许这和我想的一样无关紧要,但仍然。&gt;。&gt;)

答案 1 :(得分:1)

你不能这样做:

var tileNames[1] + "Options" = {
  //insert remaining code
};

但你可以这样做:

window['a'] = 'b';
alert(a); // shows 'b'

或者如果你在一个功能

this['a'] = 'b';

编辑:

var obj = {};
obj.a = 'a';
// obj.a == obj['a']
alert(obj['a']) // alerts a

答案 2 :(得分:1)

假设我已经理解了您的问题,您可以将瓷砖封装在一个对象中,并按您提供的名称引用该图层:

var tileNames = ["base", "parking", "access"];
var Tiles = {};

for (var i = 0; i < tileNames.length; i++) {
    Tiles[tileNames[i]] = makeOverlay(tileNames[i], coords, zoom);
};

//iterate the maps
for (var tile in Tiles)
   alert(Tiles[tile].someGoogleMapPropery)

//individually     
alert (Tiles.base.someGoogleMapPropery)
alert (Tiles.parking.someGoogleMapPropery)
//or
alert (Tiles["access"].someGoogleMapPropery)


function makeOverlay(name, coords, zoom) {
    return new google.maps.ImageMapType({
            getTileUrl: function(coord, zoom) {
                return "/maps/tiles/tiles" + name + "/" + zoom + "_" + coord.x + "_" + coord.y + ".png";
            },
            tileSize: new google.maps.Size(256, 256)
        });
}​

答案 3 :(得分:0)

可以使用eval()读取类似的变量,但不能设置它们。

示例:

var a =“b”; var b =“c”; 评估(a); //返回“c”