2013-04-09 11 views
7

मैं इस JSON डेटा संरचना है:डी 3 JSON डेटा रूपांतरण

[ 
    { "dep": "d1", "name": "name1", "size": "size1" }, 
    { "dep": "d1", "name": "name2", "size": "size2" }, 
    { "dep": "d2", "name": "name1", "size": "size3" }, 
    { "dep": "d2", "name": "name1", "size": "size4" } 
] 

और मैं इसे इस तरह एक आंतरिक संरचना को परिवर्तित करना चाहते हैं: इसे का उपयोग करने के लिए

{ 
    "name": "root", 
    "children": [ 
     { "name": "d1", 
      "children": [ 
       { "dep": "d1", "name": "name1", "size": "size1" }, 
       { "dep": "d1", "name": "name2", "size": "size2" } 
      ] 
     }, 
     { "name": "d2", 
      "children": [ 
       { "dep": "d2", "name": "name1", "size": "size3" }, 
       { "dep": "d2", "name": "name2", "size": "size4" } 
      ] 
     } 
    ] 
} 

... और आगे Reingold–Tilford Tree। क्या कोई मुझे सही दिशा में इंगित कर सकता है, मैं डी 3 के लिए काफी नया हूं!

+0

FYI करें, आप JSON, जब आप इसे परिवर्तित रूप में डेटा प्राप्त हो सकती है, जबकि, आप JavaScript वस्तुओं और सरणियों के साथ काम कर रहे हैं। इस बिंदु पर समस्या JSON के साथ अब कुछ भी नहीं है। –

+0

http://stackoverflow.com/questions/17847131/generate-multilevel-flare-json-data-format-from-flat-json यह आपके उद्देश्य को हल करना चाहिए। –

+0

आपने आरंभिक जेसन डेटा संरचना कैसे बनाई? क्या आपके पास डेटा स्रोत है और डेटा में जोड़ा गया है? या बस कड़ी कोड? –

उत्तर

9

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

var data = [ 
    { "dep": "d1", "name": "name1", "size": "size1" }, 
    { "dep": "d1", "name": "name2", "size": "size2" }, 
    { "dep": "d2", "name": "name1", "size": "size3" }, 
    { "dep": "d2", "name": "name2", "size": "size4" } 
] 

var newData = {"name": "root", "children": {}} 

data.forEach(function (d) { 
    if (typeof newData.children[d.dep] !== 'undefined') { 
     newData.children[d.dep].children.push(d) 
    } else { 
     newData.children[d.dep] = {"name": d.dep, "children": [d]} 
    } 
}) 
newData.children = Object.keys(newData.children).map(function (key) { 
    return newData.children[key]; 
}); 

अंत में असाइनमेंट ऑब्जेक्ट को सरणी में बदलना है।

कौन सा newData के लिए वांछित परिणाम देता है:

{ 
    "name": "root", 
    "children": [ 
     { "name": "d1", 
      "children": [ 
       { "dep": "d1", "name": "name1", "size": "size1" }, 
       { "dep": "d1", "name": "name2", "size": "size2" } 
      ] 
     }, 
     { "name": "d2", 
      "children": [ 
       { "dep": "d2", "name": "name1", "size": "size3" }, 
       { "dep": "d2", "name": "name2", "size": "size4" } 
      ] 
     } 
    ] 
} 

jsFiddle:http://jsfiddle.net/chrisJamesC/eB4jF/

नोट: इस विधि नेस्टेड संरचनाओं के लिए काम नहीं करता। नेस्टेड संरचनाओं के लिए ऐसा करना कठिन होगा लेकिन आप हमेशा एक पुनरावर्ती कार्य का उपयोग कर सकते हैं।


संपादित करें: उसके जवाब में @imarane ने सुझाव दिया रूप में, आप d3.nest() जो तरीका बेहतर मेरे हाथ समाधान किया जाता है का उपयोग कर सकते हैं। आप इस प्रकार अपना जवाब स्वीकार कर सकते हैं। कौन दे

var data = [ 
    { "dep": "d1", "name": "name1", "size": "size1" }, 
    { "dep": "d1", "name": "name2", "size": "size2" }, 
    { "dep": "d2", "name": "name1"}, 
    { "dep": "d2"} 
] 

var newData = { 
    "key":"root", 
    "children": 
     d3.nest() 
      .key(function(d){return d.dep}) 
      .key(function(d){return d.name}) 
      .key(function(d){return d.size}) 
      .entries(data) 
}  

: यह के साथ खेल से, यह भी सच में घोंसला के कई स्तरों के लिए आसान था

{"key":"root","children":[ 
    {"key":"d1","values":[ 
     {"key":"name2","values":[ 
      {"dep":"d1","name":"name2","size":"size1"}, 
      {"dep":"d1","name":"name2","size":"size2"} 
     ]} 
    ]}, 
    {"key":"d2","values":[ 
     {"key":"name1","values":[ 
      {"dep":"d2","name":"name1"} 
     ]}, 
     {"key":"undefined","values":[ 
      {"dep":"d2"} 
     ]} 
    ]} 
]} 

निम्नलिखित में से कौन डेटा संरचना (मैं बेहतर आशा है कि पूरे मुद्दे को समझने के लिए):

var data = [ 
    { "dep": "d1", "name": "name2", "size": "size1" }, 
    { "dep": "d1", "name": "name2", "size": "size2" }, 
    { "dep": "d2", "name": "name1"}, 
    { "dep": "d2"} 
] 

JsFiddle:http://jsfiddle.net/chrisJamesC/eB4jF/2/

नेस्ट पर अधिक:http://bl.ocks.org/phoebebright/raw/3176159/

+0

धन्यवाद, मैं आपका पहला विकल्प एक कोशिश दूंगा ... मैंने .nest() के साथ खेला है और यह डेटा परिवर्तन के लिए काम कर रहा है। लेकिन "पेड़ लेआउट" चाहता है "नाम": और "बच्चे" डिफ़ॉल्ट रूप से और मुझे "कुंजी" और "मान" नहीं मिल सका: काम करने के लिए। – alta

+0

... पहला विकल्प एक आकर्षण की तरह काम करता है! D3.nest() भाग बहुत कुशल है लेकिन "कुंजी" और "मानों" को चारों ओर काम करने की आवश्यकता है। धन्यवाद! – alta

+1

क्या आपके पास कोई सुझाव है: अपने दूसरे में "कुंजी" से "नाम" और "मान" को "बच्चों" में कैसे मैप करें। सुझाव? – alta

4

एक और विकल्प घोंसला विधि डी 3 में निर्मित उपयोग करने के लिए है ....

var nested = d3.nest() 
.key(function(d,i){ return d.dep; }) 
.entries(data); 

जो आउटपुट:

[ 
    { 
    "key": "d1", 
    "values": [ 
     { 
     "dep": "d1", 
     "name": "name1", 
     "size": "size1" 
     }, 
     { 
     "dep": "d1", 
     "name": "name2", 
     "size": "size2" 
     } 
    ] 
    }, 
    { 
    "key": "d2", 
    "values": [ 
     { 
     "dep": "d2", 
     "name": "name1", 
     "size": "size3" 
     }, 
     { 
     "dep": "d2", 
     "name": "name2", 
     "size": "size4" 
     } 
    ] 
    } 
] 

JsFiddle: http://jsfiddle.net/imrane/bSGrG/1/

+0

धन्यवाद, मैंने यह कोशिश की है। लेकिन जैसा कि मैंने उल्लेख किया है कि मुझे "कुंजी" और "मान" को "नाम" और "बच्चों" में मैप नहीं किया जा सकता है: क्योंकि यह पेड़ लेआउट द्वारा आवश्यक है। मुझे यकीन है कि आपके आस्तीन में उनको मानचित्र बनाने के लिए कुछ चाल हैं? – alta

+0

अच्छी तरह से - पेड़ के उदाहरण में आप d3.layout.tree() बच्चों (फ़ंक्शन (डी) {वापसी d.values}) का उपयोग कर बच्चों के एक्सेसर को d.values ​​में बदल सकते हैं ... ... उन्होंने जो किया है उसके लिए यहां देखें .. http://blog.pixelingene.com/2011/07/building-a-tree-diagram-in-d3-js/ – imrane

+0

यहां https://groups.google.com/forum/?fromgroups=#!topic/d3-js/L3UeeUnNHO8 और यहां http://stackoverflow.com/questions/11088303/how-to-convert-to-d3s-json-format ... ये पुराने हैं इसलिए मुझे नहीं पता कि बाद में क्या बदल गया है। जीएल। – imrane

0

अरे दोस्तों मुझे लगता है कि मुझे काफी सरल समाधान मिला है। मैंने एक पदानुक्रमित बार चार्ट के लिए एक बहुत ही व्यवस्थित तरीके से एक बड़े डेटासेट (400,000 पंक्तियों) का एक बहुत अच्छा घोंसला पूरा किया। यह अंडरस्कोर लाइब्रेरी और एक अतिरिक्त फ़ंक्शन _.nest का उपयोग करता है।सीधे शब्दों में डाउनलोड करने और आवश्यक

src="underscore-min.js" 
src="underscore.nest.js" 

फिर अपने संरचना बनाने के लिए _.nest फ़ंक्शन का उपयोग दो पुस्तकालयों में शामिल हैं।

var newdata = _.nest(data, ["Material", "StudyName"]); 

"Material" और "StudyName" स्तंभों के समूह के लिए अपने संरचना मैं चाहता हूँ कर रहे हैं: यहाँ मेरी लाइन है।

अन्य विकल्प इस सुविधा का उपयोग करने के लिए यदि आप और अधिक चीजों को पूरा करने की जरूरत है, लेकिन मैं इसे इस

0

इस प्रयोग की तरह छोड़ देंगे रहे हैं। यदि आपको आवश्यकता हो तो यू ब्राउज़र के कंसोल में आउटपुट की जांच कर सकता है।

function reSortRoot(root, value_key) { 
       //console.log("Calling"); 
       for (var key in root) { 
        if (key == "key") { 
         root.name = root.key; 
         delete root.key; 
        } 
        if (key == "values") { 
         root.children = []; 
         for (item in root.values) { 
          root.children.push(reSortRoot(root.values[item], 
            value_key)); 
         } 
         delete root.values; 
        } 
        if (key == value_key) { 
         root.value = parseFloat("1"); 
         delete root[value_key]; 
        } 
       } 
       return root; 
      } 

      var testdata=[ 
          { "dep": "d1", "name": "name1", "size": "size1" }, 
          { "dep": "d1", "name": "name2", "size": "size2" }, 
          { "dep": "d2", "name": "name1", "size": "size3" }, 
          { "dep": "d2", "name": "name1", "size": "size4" } 
         ]; 

      var testJson = d3.nest() 
      .key(function(d) { return d.dep; }) 
      .entries(testdata); 
      console.log(testJson); 

      var testRoot={}; 
      testRoot.key = "Information"; 
      testRoot.values = testJson; 
      testRoot = reSortRoot(testRoot, "name"); 

      console.log(testRoot); 
संबंधित मुद्दे