2016-06-22 4 views
2

は、私は例えば、オブジェクトのネストされたチェーンの最後にオブジェクトを作成したいです。 私の知る限りでは、あなたがこれを実行する必要があります。短絡したオブジェクトを簡単に入れ子にする方法はありますか?</p> <pre><code>window.a.b.c.d = {} </code></pre> <p>しかし、私は他にそれらを作成、パラメータであれば、Bをチェックする必要があり、かつ存在するC:たとえば

window.a = window.a || {}; 
window.a.b = window.a.b || {}; 
window.a.b.c = window.a.b.c || {}; 
window.a.b.c.d = {}; 

速く/より良い(「1つのライナー」)方法はありますか?

+0

メソッドを書く方が良いです。素早く汚れた1ライナーが必要な場合は、try ... catchを実行して、ReferenceErrorがあるかどうかを確認できます。 – Touffy

+1

'Object.keys(obj).length'でオブジェクトが現在持っているキーの数を見ることができます –

+0

2番目のステートメントから' window.'をスキップすることができます: 'window.a = window.a || {}; a.b = a.b || {}; a.b.c = a.b.c || {}; a.b.c.d = {}; '。 – Dogbert

答えて

1

あなたは以下のようにオブジェクトを書き込むことができます。

window.a = { 
    b: { 
     c: { 
      d: { 
      } 
     } 
    } 
}; 

しかし、あなたが存在しないオブジェクトにこれを作りたいときには、関数を記述する方が良いでしょう。

例:

/** 
* Create object(s) in a object. 
* 
* @param object obj 
* @param array path 
*/ 
function createObjectPath(obj, path) { 

    var currentPath = obj; 

    // Iterate objects in path 
    for(var i = 0, p; p = path[i]; i++) { 

     // Check if doesn't exist the object in current path 
     if(typeof currentPath[p] !== 'object') { 

      currentPath[p] = {}; 
     } 

     currentPath = currentPath[p]; 
    } 
} 

そして、あなたはので、この機能を使用することができます。

createObjectPath(window, ['a', 'b', 'c', 'd']); 

関数は第一引数に引数付きオブジェクトの参照を作成し、その後、引数付き配列の各文字列を反復処理します2番目のパラメータで、各文字列をオブジェクトケースとして設定すると、親オブジェクトに存在しません。

+0

実際には「高速」な解決策ではありません。非常に冗長です。しかし、ありがとう。 – ZephDavies

+0

方法なしでこれを行う方法は他にありません。たぶん、あなたは 'Array.prototype'の標準的なメソッドが必要でしょう。 – Hydro

+0

それ以外の方法がない場合、これは私が後にした答えです:) – ZephDavies

関連する問題

 関連する問題