2016-06-21 31 views
5

JSON Estratto:Come posso ottenere il percorso di navigazione di un nodo in un albero JSON Mentre scorrendo l'Albero

{ 
    "a": { 
     "b1" : { 
      "c1" : { 
       "d1" : "D1", 
       "d2" : "D2", 
       "d3" : "D3" 
      }, 
      "c2" : { 
       "d4" : "D4", 
       "d5" : "D5" 
      } 
     }, 
     "b2" : { 
      "c3" : { 
       "d6" : D6 
      } 
     } 
    } 
} 

Vorrei iterare l'Albero JSON e ottenere un elenco di valori di serie 'd' con il percorso di navigazione di ogni nodo 'd', come ad esempio

[{'name': 'd1', 'value': 'D1', 'path': ['a', 'b1', 'c1']},...] 

Ecco, ho scritto una funzione come segue:

 function GetParameters(obj) { 
      for (var sProp in obj) { 
       if(typeof(obj[sProp]) == "string") { 
        parameters.push({'name':sProp,'value':obj[sProp]})          
       } else { 
        GetParameters(obj[sProp]);        
       } 
      }    
     } 

Questa funzione genera solo le parti 'name' e 'value' di ogni record 'd', ma come posso ottenere la parte 'path' fatta in questa funzione?

Qualsiasi soluzione alternativa è benvenuta. Grazie!

risposta

1

È possibile utilizzare un approccio iterativo e ricorsivo fornendo il percorso effettivo alla ricorsione successiva.

Se viene trovato un nodo finale, un nuovo oggetto viene inviato all'array dei risultati con i nodi visitati.

function getPath(object) { 
 

 
    function iter(o, path) { 
 
     Object.keys(o).forEach(function (k) { 
 
      if (typeof o[k] === 'object') { 
 
       return iter(o[k], path.concat(k)); 
 
      } 
 
      result.push({ name: k, value: o[k], path: path }); 
 
     }); 
 
    } 
 

 
    var result = []; 
 
    iter(object, []); 
 
    return result; 
 
} 
 

 
var data = { "a": { "b1": { "c1": { "d1": "D1", "d2": "D2", "d3": "D3" }, "c2": { "d4": "D4", "d5": "D5" } }, "b2": { "c3": { "d6": "D6" } } } }; 
 

 
console.log(getPath(data));

+0

non credo che funziona! –

+0

cosa c'è di sbagliato in questo? –

+0

Uno è quello, si aggiunge un nuovo argomento 'cerca' che non posso fornire. L'altro è il risultato non è ciò che è voluto. –