我正在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?
答案 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”