2013-01-24 18 views
6

क्या कोई इस कोड को समझा सकता है? मुझे "फॉर" संरचना के अंदर क्या नहीं मिलता है।एक पेड़ में एक सरणी को परिवर्तित करना

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

ओह, मुझे अब मिल गया! सबसे पहले, मैंने सोचा कि हम वैश्विक दायरे में पेड़ के मूल्य पर लिख रहे थे, लेकिन 'पेड़' फ़ंक्शन पैरामीटर का नाम भी है! –

+2

@DanielAllenLangdon सही - जिसने ओपी की पोस्ट को अनावश्यक रूप से भ्रमित कर दिया, क्योंकि 'addToTree' के दायरे में' पेड़ 'का मूल्य जो कुछ भी पारित किया गया था, उसके लिए बाध्य होगा, जो कि मूल उदाहरण में भी वैश्विक चर' tree'। – Donut

+0

महान मैं इस दिन के लिए देख रहा था। धन्यवाद –

1

कि भ्रामक है इससे पहले कि समारोह के अंदर tree के संदर्भ में एक ही नाम के साथ बाहरी चर छाया। लेकिन जावास्क्रिप्ट में संदर्भों के संदर्भ के कारण, यह बाहरी चर को संशोधित करने के लिए समाप्त होता है।

tree के लिए एक संदर्भ के साथ
  1. कॉल समारोह (कि {} है) और तर्क
  2. लूप सरणी के रूप में ["a", "b", "c"]:

    यहाँ क्या यह कदम से करता है, कदम, केवल पहली कॉल पर विचार है।

    1. जांचें कि क्या पेड़ में पहले से ही संपत्ति "ए" है; यदि नहीं, तो मान के साथ इसे बनाने के {}
    2. पूर्ण पेड़ अब लग रहा है { a : {} } तरह
    3. अब पेड़ पर हम काम कर रहे हैं पर विचार tree.a
    4. चेक (जो खाली है) है, अगर वहाँ पहले से ही है एक संपत्ति "बी" वर्तमान पेड़ में; यदि नहीं, तो मान के साथ इसे बनाने के {}
    5. पूर्ण पेड़ अब लग रहा है { a : { b: {} } } तरह
    6. अब पेड़ पर हम काम कर रहे हैं पर विचार tree.a.b
    7. चेक (जो खाली है) है, अगर वहाँ पहले से ही है एक संपत्ति "सी" वर्तमान पेड़ में; यदि नहीं, तो मान के साथ इसे बनाने के {}
    8. पूर्ण पेड़ अब लग रहा है { a : { b: { c: {} } } } तरह
    9. अब पेड़ पर हम काम कर रहे हैं पर विचार tree.a.b.c (जो खाली है) समारोह के
  3. अंत है
+0

आपकी मदद के लिए धन्यवाद, मैं इसे बहुत अच्छी तरह से समझता हूं –

संबंधित मुद्दे