2011-07-12 73 views
3

我不使用Javascript非常好,所以我想知道是否有這樣做的更好的辦法:[「待定」我必須初始化Javascript中每個對象的級別嗎?

if (games[level] === undefined) { 
    games[level] = {}; 
    games[level]['pending'] = {}; 
} 

if (!games[level]['pending'].length) { 
    return game.create(level); 
} 

在PHP我可以試空($遊戲[$級別] ])。有沒有更好的測試方法?基本上我想要做的就是創建對象,如果它不存在。

+0

你永遠得到一個'TypeError'時甚至檢查的東西是'undefined'屬性,所以你需要。但是,我並不知道有任何提示和技巧可以使這更容易。 – pimvdb

+0

是的,我發現了困難的方式。只希望有一些能夠讓它更加優雅的「古茹」。 – rich97

回答

2
if (games[level] === undefined) { 
    games[level] = game.create(level); 
} 

如果沒有這種級別的比賽創造應該叫初始化所有需要的數據。我沒有看到將它作爲對象然後檢查「正在等待」的任何一點。它將永遠是空的,因爲你剛剛創建了這個對象。

如果你的第二個如果返回 games[level]['pending'].length的東西,你的代碼有一個很大的問題。你不能創建一個空對象(遊戲[level] ['pending'] = {}),並發現它已經 已經有屬性。

另外:

games[level] = {}; 
// games[level]['pending'] = {}; - bad 
games[level].pending = {}; // this way object properties should be used 
+0

基本上我想要做的是將一個新項目添加到待處理(等待開始遊戲)對象。在代碼遊戲[level]中,可能它已經被設置(所以undefined不會被觸發),但是沒有任何項目。因此,長度檢查。 – rich97

1

你可以讓自己做一個功能來做到這一點,將遊戲對象傳遞給像「level.pending.id.something.something」這樣的字符串並繼續創建對象。

function makeObj(obj, path) { 
    var parts = path.split("."), tmp = obj, name; 
    while (parts.length) { 
     name = parts.shift(); 
     if (typeof tmp[name] === 'undefined') { 
       tmp[name] = {}; 
     } 
     tmp = tmp[name]; 
    } 
} 

var x = {}; 
makeObj(x, "this.is.a.test"); 
1
games[level] = games[level] || {pending: {}}; 

if (!games[level].pending.length) { 
    return game.create(level); 
}