2017-11-14 2 views
1

Ich habe ein Javascript-Objekt, das Objekte als Eigenschaften verschachtelt hat. Ich möchte dieses JavaScript-Objekt durchqueren, um eine Liste aller Eigenschaften jedes Objekts innerhalb des Objekts zu erhalten.JS- Traverse-Objekt

Ich schrieb eine Funktion, um dies zu tun, aber aus irgendeinem Grund, wenn ich die Funktion ausführen, bekomme ich eine Endlosschleife von Nullen. Weiß jemand wie der Grund und die Lösung für dieses Problem ist?

var test = {a: {b: { c: 'value '}}}; 

var traverse = function(object){ 
    for (var property in object) { 
    if (object.hasOwnProperty(property)) { 
     console.log(property); 
     traverse(object[property]) 
    }else { 
     console.log('None'); 
     break; 
    } 
    } 
} 
traverse(test); 
+0

'Traverse ("value")' -> 'for (var Eigenschaft im Objekt) {/ * Eigenschaft === 0 */if (object.hasOwnProperty ("0")/* true * /) {traverse ("v")} '->' traverse ("v") '->' für (var-Eigenschaft im Objekt) {/ * property === 0 */if (object.hasOwnProperty ("0")/* true * /) {traverse ("v")} '-> ... – Andreas

Antwort

2

Sie haben einen String am Ende und diese Zeichenfolge in ein einziges Zeichen getrennt mit einem Index Null. Von dieser Zeichenkette wird das Zeichen an der Position Null genommen und die Rekursion wird erneut mit einem einzelnen Zeichen aufgerufen.

key   value   comment 
----- ------------------- ----------- 
    a { 
      b: { 
       c: "value " 
      } 
     } 

    b { 
      c: "value " 
     } 

    c "value " 

    0 "v" 
    0 "v" 
    0 "v"     and so on 

Dieser Charakter hat einen Index Null und so weiter.

Um eine solche Gewohnheit zu vermeiden, können Sie überprüfen, ob nur ein Truthy-Wert (null) und der Typ der Objekte durchlaufen werden.

var test = { a: { b: { c: 'value ' } } }; 
 

 
var traverse = function (object) { 
 
    for (var property in object) { 
 
     if (object.hasOwnProperty(property)) { 
 
      console.log(property); 
 
      if (object[property] && typeof object[property] === 'object') { 
 
       traverse(object[property]); 
 
      } 
 
     } else { 
 
      console.log('None'); 
 
     } 
 
    } 
 
} 
 
traverse(test);