2016-06-21 9 views
5

JSON Fragment:Jak mogę uzyskać ścieżkę nawigacji węzła w JSON Drzewo podczas iteracji przez drzewo

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

Chciałbym iteracyjne JSON drzewo i otrzymać listę „D” wartościami serii ze ścieżki nawigacji każdego węzła 'd', takich jak

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

Tutaj napisałem funkcję w następujący sposób:

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

Ta funkcja generuje jedynie części "name" i "value" każdego rekordu "d", ale jak mogę uzyskać w tej funkcji część "path"?

Wszelkie obejścia są mile widziane. Dzięki!

Odpowiedz

1

Można użyć podejścia iteracyjnego i rekurencyjnego z podaniem faktycznej ścieżki do następnej rekursji.

Jeśli zostanie znaleziony węzeł końcowy, nowy obiekt zostanie przekazany do tablicy wyników z odwiedzonymi węzłami.

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

, że to nie działa! –

+0

co jest z nim nie tak? –

+0

Jednym z nich jest dodanie nowego argumentu "wyszukiwanie", którego nie mogę podać. Drugi to wynik, który nie jest tym, co jest pożądane. –