2012-06-26 30 views
2

我在谷歌地圖工作,並有三個+瓷磚疊加創建。一個例子:Javascript:從字符串初始化一個變量?

瓷磚覆蓋

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

然而,爲了避免404錯誤通過我的映射範圍之外丟失磚,我的代碼是一個小更復雜的;因此,我打算做一個循環,其中分配給每個覆蓋(這裏作爲「停車」)的特定關鍵字將被插入到上述代碼中。因此:

For循環

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

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

不過,我有一個特別的問題:我不能找到一種方法,從tileNames陣列採取串並在瓷磚初始化兩個變量使用它們覆蓋代碼。理想情況下,我想實現這樣的事情:

嘗試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?

回答

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 
+0

那些是關聯數組,或一些符號的種類?我的印象是,Javascript沒有明確支持關聯數組:[link](http://www.hunlock.com/blogs/Mastering_Javascript_Arrays) –

+0

這是一個對象(關聯數組是對象),object.a == object ['a'] – cuzzea

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 ]這樣做會阻礙整體可讀性。 (。也許這並不重要,因爲我覺得這樣做,但仍高達>>)

0

可以使用eval()讀取類似的變量,但不能設置它們。

例如:

var a =「b」; var b =「c」; (a); eval(a); //返回「C」

+0

不幸的是,我正在設置它們。另外,你指的是「讀取那樣的變量」的哪一部分? –

+0

可以使用另一個變量的內容作爲名稱讀取變量。 (即變量x包含我正在嘗試讀取的變量的名稱)。 –

+0

我想我明白你的意思了: 'b = new google.maps; baseMapType = b;的eval(baseMapType)'。沒有?我們仍然存在從tileNames數組中命名「baseMapType」的問題,即類似於'tileNames [0] +「MapType //應該讀取'baseMapType'' –

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) 
     }); 
}​ 
+0

非常感謝這個答案,當我玩弄對象時你的例子使cuzzea的意圖對我很清楚。 –