2013-10-11 31 views
5

經過一番爭吵後,我差點想到如何將平面json文件轉換爲分層json文件。我沒有自己寫這個函數。我從下面的文章中複製它。將平板JSON文件轉換爲分層json數據,例如flare.json [d3示例文件]

D3 JSON DATA CONVERSION

但是現在現在的問題是,這是寫在帖子的功能剛剛2級層次。但我正在尋找4級的層次結構。我試圖覆蓋功能,但我失敗了。

代碼與我想要的。

 

    
     var data = [ 
     { "dep": "First Top", "name": "First child", "model": "value1", "size": "320" }, 
     { "dep": "First Top", "name": "First child", "model": "value2", "size": "320" }, 
     { "dep": "First Top", "name": "First child", "model": "value3", "size": "320" }, 
     { "dep": "First Top", "name": "First child", "model": "value4", "size": "320" }, 
     { "dep": "First Top", "name": "SECOND CHILD", "model": "value1", "size": "320" }, 
     { "dep": "First Top", "name": "SECOND CHILD", "model": "value2", "size": "320" }, 
     { "dep": "First Top", "name": "SECOND CHILD", "model": "value3", "size": "320" }, 
     { "dep": "First Top", "name": "SECOND CHILD", "model": "value4", "size": "320" }, 
     { "dep": "Second Top", "name": "First Child", "model": "value1", "size": "320" }, 
     { "dep": "Second Top", "name": "First Child", "model": "value2", "size": "320" }, 
     { "dep": "Second Top", "name": "First Child", "model": "value3", "size": "320" }, 
     { "dep": "Second Top", "name": "First Child", "model": "value4", "size": "320" }, 
     { "dep": "Second Top", "name": "SECOND CHILD", "model": "value1", "size": "320" }, 
     { "dep": "Second Top", "name": "SECOND CHILD", "model": "value2", "size": "320" }, 
     { "dep": "Second Top", "name": "SECOND CHILD", "model": "value3", "size": "320" }, 
     { "dep": "Second Top", "name": "SECOND CHILD", "model": "value4", "size": "320" }, 
     { "dep": "Third Top", "name": "First Child", "model": "value2", "size": "320" }, 
     { "dep": "Third Top", "name": "First Child", "model": "value3", "size": "320" }, 
     { "dep": "Third Top", "name": "First Child", "model": "value4", "size": "320" }, 
     { "dep": "Third Top", "name": "First Child", "model": "value5", "size": "320" }, 
     { "dep": "Third Top", "name": "Second Child", "model": "value1", "size": "320" }, 
     { "dep": "Third Top", "name": "Second Child", "model": "value2", "size": "320" }, 
     { "dep": "Third Top", "name": "Second Child", "model": "value3", "size": "320" }, 
     { "dep": "Third Top", "name": "Second Child", "model": "value4", "size": "320" } 
     ] 

    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": [{"name": d.name, "children": [{"name": d.model, "size": d.size}]}]} 
     } 
    }) 





    newData.children = Object.keys(newData.children).map(function (key) { return newData.children[key]; }); 

       // show what we've got 
       d3.select('body').append('pre') 
        .text(JSON.stringify(newData, null, ' ')); 
     

輸出電流代碼

 

    { 
     "name": "root", 
     "children": [ 
     { 
      "name": "First Top", 
      "children": [ 
      { 
       "name": "First child", 
       "children": [ 
       { 
        "name": "value1", 
        "size": "320" 
       } 
       ] 
      }, 
      { 
       "dep": "First Top", 
       "name": "First child", 
       "model": "value2", 
       "size": "320" 
      }, 
      { 
       "dep": "First Top", 
       "name": "First child", 
       "model": "value3", 
       "size": "320" 
      }, 
      { 
       "dep": "First Top", 
       "name": "First child", 
       "model": "value4", 
       "size": "320" 
      }, 
      { 
       "dep": "First Top", 
       "name": "SECOND CHILD", 
       "model": "value1", 
       "size": "320" 
      }, 
      { 
       "dep": "First Top", 
       "name": "SECOND CHILD", 
       "model": "value2", 
       "size": "320" 
      }, 
      { 
       "dep": "First Top", 
       "name": "SECOND CHILD", 
       "model": "value3", 
       "size": "320" 
      }, 
      { 
       "dep": "First Top", 
       "name": "SECOND CHILD", 
       "model": "value4", 
       "size": "320" 
      } 
      ] 
     }, 
     { 
      "name": "Second Top", 
      "children": [ 
      { 
       "name": "First Child", 
       "children": [ 
       { 
        "name": "value1", 
        "size": "320" 
       } 
       ] 
      }, 
      { 
       "dep": "Second Top", 
       "name": "First Child", 
       "model": "value2", 
       "size": "320" 
      }, 
      { 
       "dep": "Second Top", 
       "name": "First Child", 
       "model": "value3", 
       "size": "320" 
      }, 
      { 
       "dep": "Second Top", 
       "name": "First Child", 
       "model": "value4", 
       "size": "320" 
      }, 
      { 
       "dep": "Second Top", 
       "name": "SECOND CHILD", 
       "model": "value1", 
       "size": "320" 
      }, 
      { 
       "dep": "Second Top", 
       "name": "SECOND CHILD", 
       "model": "value2", 
       "size": "320" 
      }, 
      { 
       "dep": "Second Top", 
       "name": "SECOND CHILD", 
       "model": "value3", 
       "size": "320" 
      }, 
      { 
       "dep": "Second Top", 
       "name": "SECOND CHILD", 
       "model": "value4", 
       "size": "320" 
      } 
      ] 
     }, 
     { 
      "name": "Third Top", 
      "children": [ 
      { 
       "name": "First Child", 
       "children": [ 
       { 
        "name": "value2", 
        "size": "320" 
       } 
       ] 
      }, 
      { 
       "dep": "Third Top", 
       "name": "First Child", 
       "model": "value3", 
       "size": "320" 
      }, 
      { 
       "dep": "Third Top", 
       "name": "First Child", 
       "model": "value4", 
       "size": "320" 
      }, 
      { 
       "dep": "Third Top", 
       "name": "First Child", 
       "model": "value5", 
       "size": "320" 
      }, 
      { 
       "dep": "Third Top", 
       "name": "Second Child", 
       "model": "value1", 
       "size": "320" 
      }, 
      { 
       "dep": "Third Top", 
       "name": "Second Child", 
       "model": "value2", 
       "size": "320" 
      }, 
      { 
       "dep": "Third Top", 
       "name": "Second Child", 
       "model": "value3", 
       "size": "320" 
      }, 
      { 
       "dep": "Third Top", 
       "name": "Second Child", 
       "model": "value4", 
       "size": "320" 
      } 
      ] 
     } 
     ] 
    } 

所需的輸出格式:

 

    { 
     "name": "root", 
     "children": [ 
     { 
      "name": "First Top", 
      "children": [ 
      { 
       "name": "First child", 
       "children": [ 
       { 
        "name": "value1", 
        "size": "320" 
       }, 
       { 
        "name": "value2", 
        "size": "320" 
       }, 
       { 
        "name": "value3", 
        "size": "320" 
       }, 
       { 
        "name": "value4", 
        "size": "320" 
       } 
       ] 
      }, 
      { 
       "name": "Second child", 
       "children": [ 
       { 
        "name": "value1", 
        "size": "320" 
       }, 
       { 
        "name": "value2", 
        "size": "320" 
       }, 
       { 
        "name": "value3", 
        "size": "320" 
       }, 
       { 
        "name": "value4", 
        "size": "320" 
       } 
       ] 
      }, 

      ] 
     }, 
     { 
      "name": "Second Top", 
      "children": [ 
      { 
       "name": "First child", 
       "children": [ 
       { 
        "name": "value1", 
        "size": "320" 
       }, 
       { 
        "name": "value2", 
        "size": "320" 
       }, 
       { 
        "name": "value3", 
        "size": "320" 
       }, 
       { 
        "name": "value4", 
        "size": "320" 
       } 
       ] 
      }, 
      { 
       "name": "Second child", 
       "children": [ 
       { 
        "name": "value1", 
        "size": "320" 
       }, 
       { 
        "name": "value2", 
        "size": "320" 
       }, 
       { 
        "name": "value3", 
        "size": "320" 
       }, 
       { 
        "name": "value4", 
        "size": "320" 
       } 
       ] 
      }, 
      ] 
     }, 
     { 
      "name": "Third Top", 
      "children": [ 
      { 
       "name": "First child", 
       "children": [ 
       { 
        "name": "value1", 
        "size": "320" 
       }, 
       { 
        "name": "value2", 
        "size": "320" 
       }, 
       { 
        "name": "value3", 
        "size": "320" 
       }, 
       { 
        "name": "value4", 
        "size": "320" 
       } 
       ] 
      }, 
      { 
       "name": "Second child", 
       "children": [ 
       { 
        "name": "value1", 
        "size": "320" 
       }, 
       { 
        "name": "value2", 
        "size": "320" 
       }, 
       { 
        "name": "value3", 
        "size": "320" 
       }, 
       { 
        "name": "value4", 
        "size": "320" 
       } 
       ] 
      }, 
      ] 
     } 
     ] 
    } 

我從一個星期破解我的頭,但獨自我不能想辦法。有人請修改該函數以獲取更新後的分層格式的數據。

在此先感謝!

回答

14

更新使用遞歸方法

這應該n水平,而不是僅僅2或3。你只需要到指定的屬性定義哪些層面發揮作用。

var data = [ 
    { "dep": "First Top", "name": "First child", "model": "value1", "size": "320" }, 
    { "dep": "First Top", "name": "First child", "model": "value2", "size": "320" }, 
    { "dep": "First Top", "name": "SECOND CHILD", "model": "value1", "size": "320" }, 
    { "dep": "Second Top", "name": "First Child", "model": "value1", "size": "320" } 
]; 

var newData = { name :"root", children : [] }, 
    levels = ["dep","name"]; 

// For each data row, loop through the expected levels traversing the output tree 
data.forEach(function(d){ 
    // Keep this as a reference to the current level 
    var depthCursor = newData.children; 
    // Go down one level at a time 
    levels.forEach(function(property, depth){ 

     // Look to see if a branch has already been created 
     var index; 
     depthCursor.forEach(function(child,i){ 
      if (d[property] == child.name) index = i; 
     }); 
     // Add a branch if it isn't there 
     if (isNaN(index)) { 
      depthCursor.push({ name : d[property], children : []}); 
      index = depthCursor.length - 1; 
     } 
     // Now reference the new child array as we go deeper into the tree 
     depthCursor = depthCursor[index].children; 
     // This is a leaf, so add the last element to the specified branch 
     if (depth === levels.length - 1) depthCursor.push({ name : d.model, size : d.size }); 
    }); 
}); 
+0

嗨 - 理查德。謝謝回覆。但我無法獲得json格式的名稱列。我得到了dep列值,然後是模型值。在這兩者之間,我需要添加名稱,即dep> name> value。我該怎麼做。編輯這個功能我不太擅長。我嘗試改變這一行 - newData.children [d.dep] .children [childIndex] = {name:d.name,children [{name:d.model,size:d.size}]};但無法得到它。再次感謝您。 –

+0

非常感謝Richard。經過多日的奮鬥,我能夠在你的幫助下做到這一點。再次感謝! –

+0

嗨理查德 - 請幫我這個[**後**](http://stackoverflow.com/questions/23737829/d3-help-required-in-editing-function)。 –

1
var data = [ 
    { "state": "UP", "district": "Agra", "block": "IradatNagar","school":"APS","name":"A" }, 
    { "state": "UP", "district": "Agra", "block": "IradatNagar","school":"IPS","name":"B" }, 
    { "state": "UP", "district": "Agra", "block": "IradatNagar","school":"APS","name":"C" }, 
    { "state": "MP", "district": "Bhopal", "block": "chota_Bhopal","school":"DPS","name":"D" }, 
    { "state": "UP", "district": "Mathura", "block": "Farah","school":"HPS","name":"E" }, 
    { "state": "UP", "district": "Kanpur", "block": "Mania","school":"BPs","name":"F" }, 
    { "state": "UP", "district": "Agra", "block": "Arjun Nagar","school":"GPS","name":"G" }, 
    { "state": "MP", "district": "Gwalior", "block": "Surya Nagar","school":"DPS","name":"H" } 
]; 

var newData = { name :"State", children : [] }, 
    levels = ["state","district","block","school"]; 

data.forEach(function(d){ 
    var depthCursor = newData.children; 
    levels.forEach(function(property, depth) 
    { 
     var index; 
     depthCursor.forEach(function(child,i) 
     { 
      if (d[property] == child.name) 
       index = i; 
     }); 

     if (isNaN(index)) 
     { 
      depthCursor.push({name : d[property], children : []}); 
      index = depthCursor.length - 1; 
     } 

     depthCursor = depthCursor[index].children; 

     if (depth === levels.length - 1) 
     { 
      depthCursor.push({ name : d.name}); 
     } 
    }); 
}); 

console.log(newData);