2013-10-11 12 views
5

Dopo una lotta noiosa ho quasi capito come convertire un file json piatto in uno gerarchico. Non ho scritto la funzione da solo. L'ho copiato dal post sottostante.Converti il ​​file JSON piatto in dati json gerarchici come flare.json [file d3 esempio]

D3 JSON DATA CONVERSION

Ma ora il problema ora è, la funzione che è stato scritto nel post non ha solo 2 livelli gerarchici. Ma sto cercando una gerarchia di 4 livelli. Ho provato a scavalcare la funzione in cui ho fallito ma.

Codice con quello che sto cercando.

 

    
     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, ' ')); 
     

uscita del codice corrente

 

    { 
     "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" 
      } 
      ] 
     } 
     ] 
    } 

desiderata Output Format:

 

    { 
     "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" 
       } 
       ] 
      }, 
      ] 
     } 
     ] 
    } 

sto di cracking la testa da una settimana ma io da sola non ci riuscivo capirlo. Qualcuno si prega di modificare la funzione per ottenere i dati nel formato gerarchico come ho aggiornato.

Grazie in anticipo !!

risposta

14

aggiornato per utilizzare un metodo ricorsivo

Questo dovrebbe funzionare per n livelli e non solo 2 o 3. Hai solo bisogno di specificare quali proprietà definiscono quali livelli.

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

Hi - Richard. Grazie per la risposta. Ma non ho potuto ottenere la colonna del nome nel formato JSON. Sto ottenendo i valori della colonna dep seguiti dal valore del modello. Tra questi due ho bisogno di aggiungere il nome i.e, dep> nome> valore. Come lo faccio. Non sono così bravo a modificare la funzione. Ho provato a cambiare questa riga: newData.children [d.dep] .children [childIndex] = {nome: d.name, children [{nome: d.model, dimensione: d.size}]}; ma non ho potuto capirlo. Grazie in anticipo di nuovo. –

+0

Grazie mille Richard. Dopo molti giorni di lotta, sono riuscito a farlo con il tuo aiuto. Grazie mille ancora !! –

+0

Ciao Richard - Per favore aiutami con questo [** post **] (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);