Ich habe ein Objekt (Analysebaum), das untergeordnete Knoten enthält, die Verweise auf andere Knoten sind.
Ich möchte dieses Objekt mit serialisieren JSON.stringify()
, aber ich verstehe
TypeError: zyklischer Objektwert
wegen der Konstrukte, die ich erwähnt habe.
Wie könnte ich das umgehen? Es ist mir egal, ob diese Verweise auf andere Knoten im serialisierten Objekt dargestellt werden oder nicht.
Andererseits scheint es mühsam, diese Eigenschaften beim Erstellen aus dem Objekt zu entfernen, und ich möchte keine Änderungen am Parser (Narzisse) vornehmen.
javascript
json
jsonserializer
stringify
Loic Duros
quelle
quelle
cycle.js
als Antwort hier zu haben, da dies für viele Fälle die am besten geeignete Lösung ist. Es erscheint angemessen, diese Antwort zu veröffentlichen, da Sie der erste sind, der darauf verweist (in Ihrem Kommentar unten). Wenn Sie keine Lust haben, es selbst als Antwort zu veröffentlichen, werde ich es irgendwann tun.Antworten:
Verwenden Sie den zweiten Parameter von
stringify
, die Ersetzungsfunktion , um bereits serialisierte Objekte auszuschließen:http://jsfiddle.net/mH6cJ/38/
Wie in anderen Kommentaren richtig ausgeführt, entfernt dieser Code jedes "gesehene" Objekt, nicht nur "rekursive".
Zum Beispiel für:
Das Ergebnis ist falsch. Wenn Ihre Struktur so ist, möchten Sie möglicherweise Crockfords Decycle oder diese (einfachere) Funktion verwenden, die nur rekursive Referenzen durch Nullen ersetzt:
quelle
Ich habe einen GitHub Gist erstellt, der zyklische Strukturen erkennen und auch de- und codieren kann: https://gist.github.com/Hoff97/9842228
Verwenden Sie zum Transformieren einfach JSONE.stringify / JSONE.parse. Es de- und codiert auch Funktionen. Wenn Sie dies deaktivieren möchten, entfernen Sie einfach die Zeilen 32-48 und 61-85.
Ein Beispiel für eine Geige finden Sie hier:
http://jsfiddle.net/hoff97/7UYd4/
quelle
Dies ist eine Art alternative Antwort, aber da viele Leute hierher kommen werden, um ihre kreisförmigen Objekte zu debuggen, und es keine wirklich gute Möglichkeit gibt, dies zu tun, ohne eine Menge Code einzuziehen, geht es weiter.
Eine Funktion, die nicht so bekannt ist wie sie
JSON.stringify()
istconsole.table()
. Rufenconsole.table(whatever);
Sie einfach auf , und die Variable wird in tabellarischer Form in der Konsole protokolliert, wodurch es ziemlich einfach und bequem ist, den Inhalt der Variablen zu lesen.quelle
viel sparen und es zeigt, wo ein Zyklusobjekt war.
produziert
quelle
obj.b=this'
wenn jemand weiß, wie man sehr lange Berechnungen verhindert, die mit einem falsch vorgegebenen Bereich durchgeführt wurden. Esthis
wäre schön, dies hier zu sehenseen.indexOf(v) != -1
Ich erstelle auch ein Github-Projekt, das zyklische Objekte serialisieren und die Klasse wiederherstellen kann, wenn Sie sie wie ein String im Attribut serializename speichern
https://github.com/bormat/serializeStringifyParseCyclicObject
Bearbeiten: Ich habe mein Skript für NPM https://github.com/bormat/borto_circular_serialize transformiert und die Funktionsnamen von Französisch auf Englisch geändert.
quelle
Hier ist ein Beispiel für eine Datenstruktur mit zyklischen Referenzen:
Wenn Sie die zyklischen Referenzen BEHALTEN möchten (stellen Sie sie beim Deserialisieren wieder her, anstatt sie zu "nuken"), haben Sie zwei Möglichkeiten, die ich hier vergleichen werde. Erstens ist Douglas Crockfords cycle.js , zweitens ist mein Sibirien- Paket. Beide arbeiten, indem sie zuerst das Objekt "decycling", dh ein anderes Objekt (ohne zyklische Referenzen) konstruieren, "das die gleichen Informationen enthält".
Herr Crockford geht zuerst:
Wie Sie sehen, bleibt die verschachtelte Struktur von JSON erhalten, aber es gibt eine neue Sache, nämlich Objekte mit der speziellen
$ref
Eigenschaft. Mal sehen, wie das funktioniert.Das Dollarzeichen steht für die Wurzel.
.bolt
Nachdem$ref
wir erfahren haben, dass.bolt
es sich um ein "bereits gesehenes" Objekt handelt, und der Wert dieser speziellen Eigenschaft (hier der String $ ["nut"] ["need"]) sagt uns, wo, siehe zuerst===
oben. Ebenso für die zweite$ref
und die zweite===
oben.Verwenden wir einen geeigneten Tiefengleichheitstest (nämlich Anders Kaseorgs
deepGraphEqual
Funktion aus der akzeptierten Antwort auf diese Frage ), um festzustellen, ob das Klonen funktioniert.Nun, Sibirien:
Sibirien versucht nicht, "klassisches" JSON nachzuahmen, keine verschachtelte Struktur. Der Objektgraph wird "flach" beschrieben. Jeder Knoten des Objektgraphen wird in einen flachen Baum umgewandelt (einfache Schlüsselwertpaarliste mit nur ganzzahligen Werten). Dies ist ein Eintrag in
.forest.
Bei Index Null finden wir das Stammobjekt, bei höheren Indizes finden wir die anderen Knoten von Das Objektdiagramm und negative Werte (eines Schlüssels eines Baums der Gesamtstruktur) verweisen auf dasatoms
Array (das über das Array types eingegeben wird, aber die Eingabedetails werden hier übersprungen). Alle Endknoten befinden sich in der Atomtabelle, alle nicht-Endknoten befinden sich in der Gesamtstrukturtabelle, und Sie können sofort sehen, wie viele Knoten der Objektgraph hat, nämlichforest.length
. Testen wir, ob es funktioniert:Vergleich
wird später einen Abschnitt hinzufügen.
quelle
Eine Vorbedingung fehlte, andernfalls werden die ganzzahligen Werte in Array-Objekten abgeschnitten, dh [[08.11.2014 12:30:13, 1095]] 1095 wird auf 095 reduziert.
quelle