2011-07-10 99 views
8

我想創建一個對象,從像開始:的Javascript:多維對象

var map = {}; 

然後,我想利用這個功能添加項目:

add = function(integerA, objectB) { 
    map[objectB.type][integerA] = objectB; 
} 

所以,這是我想實現的對象結構的一個隨機示例:

map = { 
    'SomeType' : { 0 : 'obj', 2 : 'obj', 3 : 'obj' }, 
    'OtherType' : { 0 : 'obj', 5 : 'obj' }, 
}; 

現在,我的問題。我不能做map[objectB.type][integerA] = objectB;,因爲map[objectB.type]沒有定義。我可以通過if語句檢查map[objectB.type]是否存在並在必要時創建map[objectB.type] = {};來解決此問題。

否則,我可以預加載所有對象類型。不過,我寧願不必這樣做。

我的問題:有沒有辦法可以創建對象,而不必檢查每次我想調用add函數時是否已經存在類型或預加載所有類型?

重要的是我的添加功能是如此之快以及地圖對象是正確的,因爲我需要在很短的時間內讀取和寫入很多東西(這是一個動畫/遊戲應用程序)。

+1

你確定它會是一個性能問題嗎?如果我是你,我會先嚐試一下,看看它是否有問題。在一天結束時,無論你需要做檢查,或JavaScript引擎,所以說明將需要處理 –

+0

這個鏈接有你的問題的答案 http://stackoverflow.com/questions/7744611/pass-variables-by-reference-in-javascript –

回答

9

不,沒有任何其他方式可以隨時創建對象。每次只檢查是否存在:

add = function(integerA, objectB) { 
    if (!map[objectB.type]) { 
     map[objectB.type] = {};   
    } 
    map[objectB.type][integerA] = objectB; 
} 

如果你想提高性能,你可以考慮一些緩存技術。

+0

我很欣賞所有的答案,這個是最清楚的。我會選擇預加載類型。 – user8363

3

您可以使用布爾OR快捷方式(至少避免明確的if)。它可能不是可讀,但:

var data = map[objectB.type] || (map[objectB.type] = {}); 
data[integerA] = objectB; 

這工作,因爲工作分配實際返回分配的價值和OR表達式返回結果爲true第一個值。

我不認爲使用if對性能有任何影響,但實際上,我的答案中的方式甚至可能會變得更慢。

3

如果您僅將地圖用於查找,並且您不需要遍歷維度,則可以將維度合併爲單個密鑰。例如:

add = function(integerA, objectB) { 
    var key = objectB.type + '-' + integerA; 
    map[key] = objectB; 
}