2014-01-06 2 views
5

Wenn ich Uncaught TypeError: Converting circular structure to JSON auf einer großen Struktur bekomme, kann es sehr schwierig sein herauszufinden, wo genau die zirkuläre Referenz ist.So finden Sie die zirkuläre Struktur in JSON.stringify: Uncaught TypeError: Konvertieren der kreisförmigen Struktur in JSON?

Gibt es eine einfache Möglichkeit, das zirkuläre Element in der Datenstruktur zu finden/debuggen?

+0

Wenn es nicht * zu * riesig ist, konntest du einfach 'console.dir()' das Objekt und dann interaktiv in der Browserkonsole herumstochern. – Pointy

Antwort

4

Ich habe keine einfache Methode gefunden, um es zu tun, andere Leute scheinen vorzuschlagen mit benutzerdefinierten Replacer-Funktion in JSON.Stringify zu steuern, welche Eigenschaften besucht wurden.

ich versucht habe solche replacer zu schreiben:

function detector(obj) { 
    function collector (stack, key, val) { 
     var idx = stack[stack.length - 1].indexOf(key); 

     try { 
      var props = Object.keys(val); 
      if (!props.length) throw props; 
      props.unshift({idx : idx}); 
      stack.push(props); 
     } catch (e) { 
      while (!(stack[stack.length - 1].length - 2)) { 
       idx = stack[stack.length -1][0].idx; 
       stack.pop(); 
      } 

      if (idx + 1) { 
       stack[stack.length - 1].splice(idx, 1); 
      } 
     } 

     return val; 
    } 

    var stack = [[]]; 

    try { 
     JSON.stringify(obj, collector.bind(null, stack)); 
    } catch (e) { 
     if (e.message.indexOf('circular') !== -1) { 
      var idx = 0; 
      var path = ''; 
      var parentProp = ''; 
      while(idx + 1) { 
       idx = stack.pop()[0].idx; 
       parentProp = stack[stack.length - 1][idx]; 
       if (!parentProp) break; 
       path = '.' + parentProp + path; 
      } 

      console.log(path); 
     } 
    } 
} 

Was sie tut, ist, während der Baum JSON durchqueren (wahrscheinlich Baum :)) es Namen von Eigenschaften sammelt, die so bald wie JSON besucht wurden. stringify erkennt Kreisreferenz und Würfe, die Variable 'stack' enthält eine Spur, welche Teilbäume sie gerade durchquert. Und es protokolliert diesen Pfad zur Konsole.

Dies ist jedoch keine stark getestete Lösung.

Verwandte Themen