2010-03-09 154 views
17

我已經建立了一個數據驅動的谷歌地圖,根據不同的圖標分配到地圖,取決於所在物品的類型。因此,如果我有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 - 歡迎來到StackOverflow :-) – 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

回答

33

這真的很容易做到: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

3

你會更好,創建一個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" 
5

如果你要做到這一點使用聲明的對象,如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

4

就直接回答你的問題(雖然請注意,這是不是你想要的解決檢查出其他的答案這僅僅是文檔!),這裏是從JavaScript控制檯複製粘貼:

> window["myNamedVar"] = "Hello, World!"; 
> console.log(myNamedVar); 
    "Hello, World!" 
1

你真的需要這些變量?你能不能做到這一點:

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

相關問題