2011-07-12 11 views
3

私は、私はこれを行うためのより良い方法があればと思いましてJavaScriptでひどく苦手:[$レベル] [「保留」PHPでJavascriptでオブジェクトのすべてのレベルを初期化する必要がありますか?

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

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

が、私はちょうど空($ゲームをテストすることができます])。これをテストする良い方法はありますか?基本的には、オブジェクトが存在しない場合はそのオブジェクトを作成するだけです。

+0

でも 'undefined'何かのプロパティをチェックするときは、必ず' TypeError'を得るでしょう、あなたがする必要があります。しかし、これを簡単にするためのヒントやトリックは認識していません。 – pimvdb

+0

ええ、私はそれを辛い方法で見つけました。ちょうどそこにいくつかの "教祖"があることを期待して、少し優雅にすることができます。 – rich97

答えて

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

そのようなレベルのゲームが作成していないが存在する場合に必要なすべてのデータを初期化するために呼び出す必要があります。私はそれをオブジェクトにしてから "保留中"をチェックすることは何もしていません。オブジェクトを作成したばかりなので、常に空になります。

games[level]['pending'].lengthの2番目のifが何かを返す場合、コードに大きな問題があります。空のオブジェクト(ゲーム[レベル] ['pending'] = {})を作成することはできません。 がすでにになっています。また

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

基本的には、保留中の(ゲームを開始するのを待っている)オブジェクトに新しいアイテムを追加します。コードゲーム[レベル] .pendingでは、既に設定されているため(定義されていないため未定義になる可能性があります)、アイテムがありませんでした。したがって、.lengthチェック。 – 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); 
} 
関連する問題