2013-01-24 7 views
6

誰かがこのコードを説明できますか?私は "for"構造の中にあるものを取得しません。アレイをツリーに変換する

var tree = {} 

function addToTree(tree, array) { 
    for (var i = 0, length = array.length; i < length; i++) { 
     tree = tree[array[i]] = tree[array[i]] || {} 
    } 
} 

addToTree(tree, ["a", "b", "c"]) 
addToTree(tree, ["a", "b", "d"]) 

/*{ 
    "a": { 
     "b": { 
      "c": {}, 
      "d": {} 
     } 
    } 
}*/ 
+1

ええと...このコードは動作しますか?もしそうなら、私は何が起こっているのかを知りたい。 –

+0

これは、配列をツリーに変換します。オブジェクトツリーのように、コメントコードはツリーの出力です。これは元の投稿です:http://stackoverflow.com/q/3663096/2007780 –

+2

これはいくつかの醜いコードです! – bfavaretto

答えて

1

私はforループの本体を拡大し、物事をより明確にするための試みでいくつかのコメントを追加しました。

for (var i = 0, length = array.length; i < length; i++) { 
    // Assign the current item in the array to a variable 
    var current = array[i]; 

    // If there is no property on the "tree" object corresponding to the value of 
    // "current", set this property to a new object 
    if (!tree[current]) { 
     tree[current] = {}; 
    } 

    // Set the "tree" variable to the field in the "tree" object whose 
    // name corresponds to "current". On the next loop iteration, "tree" will 
    // refer to this "child" object, resulting in a tree-like object being 
    // created as we iterate. 
    tree = tree[current]; 
} 
+0

ああ、今すぐ入手!最初は、グローバルスコープでtreeの値を上書きしていると思っていましたが、 'tree'も関数のパラメータの名前です! –

+2

@DanielAllenLangdon Correct - OPのポストを不必要に混乱させました。なぜなら、 'addToTree'の範囲内の' tree'の値は、渡されたものにバインドされるからです。元の例では、木 'である。 – Donut

+0

偉大な私はこのすべての日を探していた。ありがとう –

1

関数内のtreeへの参照が同じ名前の外部変数をシャドウする前に、混乱します。しかし、JavaScriptで参照がどのように機能するかによって、外部変数を変更することになります。

  1. コールtreeを基準とした機能(つまり{}ある)と["a", "b", "c"]引数
  2. ループ配列として:ここで

    は最初の呼び出しを考慮し、それが何をステップバイステップです。

    1. すでにツリーに「a」というプロパティがあるかどうかを確認してください。ない場合は、プロパティ「b」はすでに存在している場合今、私たちが取り組んでいるツリーが(空である)tree.a
    2. チェックで考慮ツリー全体が今{ a : {} }
    3. のように見える値{}
    4. でそれを作成します現在のツリーにあります。ない場合は、プロパティ「c」はすでに存在している場合今、私たちが取り組んでいるツリーが(空である)tree.a.b
    5. チェックで考慮ツリー全体が今{ a : { b: {} } }
    6. のように見える値{}
    7. でそれを作成します現在のツリーにあります。ない場合は、今、私たちが取り組んでいる木が機能
    の(空である)tree.a.b.c
  • エンドで考えるいっぱい木が今{ a : { b: { c: {} } } }
  • のように見える値{}
  • でそれを作成します
  • +0

    あなたの助けをありがとう、私はそれを非常によく理解しています –

    関連する問題