2012-08-13 15 views
7

मुझे यकीन है कि ऐसा करने के लिए वास्तव में एक सरल तरीका है लेकिन मैं इसे काफी समझ नहीं सकता।डी 3: पेरेंट कुंजी के साथ फ्लैट डेटा को पदानुक्रम में बदलने के लिए घोंसला फ़ंक्शन का उपयोग करें

[ 
{id: 1, name: "Peter"}, 
{id: 2, name: "Paul", manager: 1}, 
{id: 3, name: "Mary", manager: 1}, 
{id: 4, name: "John", manager: 2}, 
{id: 5, name: "Jane", manager: 2} 
] 

संभव हो तो, मैं d3.js घोंसला ऑपरेटर का उपयोग करने के लिए एक संरचना पदानुक्रम लेआउट में उपयोग करने के लिए प्राप्त करना चाहते हैं: मैं कुछ इनपुट डेटा है कि इस तरह दिखता है। इस तरह:

[ 
    {name: "Peter", children: [ 
      {name:"Paul", children: [ 
       {name:"John"}, 
       {name:"Jane"} 
      ]}, 
      {name:"Mary"} 
     ] 
    } 
] 

उत्तर

12

आप यहाँ घोंसला ऑपरेटर का उपयोग नहीं कर सकते क्योंकि नेस्टिंग एक निश्चित पदानुक्रम का उत्पादन: उत्पादन पदानुक्रम में स्तरों की संख्या महत्वपूर्ण कार्य आपके द्वारा निर्दिष्ट की संख्या के रूप में ही है।

उसने कहा, आप अपना खुद का कार्य लिख सकते हैं जो एक पेड़ पैदा करता है। यह मानते हुए कि रूट नोड इनपुट सरणी में पहला नोड है, आप आईडी से नोड तक एक नक्शा बना सकते हैं, और उसके बाद आलसी आलसी बना सकते हैं।

function tree(nodes) { 
    var nodeById = {}; 

    // Index the nodes by id, in case they come out of order. 
    nodes.forEach(function(d) { 
    nodeById[d.id] = d; 
    }); 

    // Lazily compute children. 
    nodes.forEach(function(d) { 
    if ("manager" in d) { 
     var manager = nodeById[d.manager]; 
     if (manager.children) manager.children.push(d); 
     else manager.children = [d]; 
    } 
    }); 

    return nodes[0]; 
} 

आप जानते हैं कि नोड्स क्रम में सूचीबद्ध हैं ऐसी है कि प्रबंधकों को अपनी रिपोर्ट से पहले दिखाई देते हैं, तो आप केवल एक बार दोहराने में कोड को आसान बनाने में कर सकते हैं।

+1

बहुत बहुत धन्यवाद, यह बहुत उपयोगी था। मैं वास्तव में पेड़ के शीर्ष से शुरू हुआ (1) मैनेजर (सरणी के शब्दकोश) के आधार पर एक लुकअप बनाना, (2) ज्ञात जड़ से शुरू करना, बच्चों को प्रत्येक रिपोर्ट में दोबारा जोड़ना। – prauchfuss