I want to save locally an object which has circular references. What are my options?
My first thought was using HTML5 local storage but I can't stringify this object due to the circular references.
Specifically I'm trying to save the DOMSelection object of the current selection.
Example:
var sel = window.getSelection();
var selstring = JSON.stringify(sel); // Breaks here ...
localStorage.setItem("selection",selstring);
The only way I could get the stringify to work now is by ignoring certain objects like so:
var selstring = JSON.stringify(sel,function(k,v){
if( k=="anchorNode" ||
k=="baseNode" ||
k=="extentNode" ||
k=="focusNode") return undefined;
return v;
});
But this leaves me with a rather empty DOMSelection object which isn't enough for what I need.
Is there any other way I can save this object? The only requirement is that it runs in mobile safari, anything else goes really. The solution can be either in javascript or jquery (or any other js lib if need be).
Thanks for any help you can provide.
A circular reference occurs when one heap variable contains a reference to a second heap variable, and the second one contains a reference back to the first. For instance, if A is an object, and somewhere in A, there is a reference to B, and within B is a reference back to A, there is a circular reference.
The circular reference error message "There are one or more circular references where a formula refers to its own cell either directly or indirectly. This might cause them to calculate incorrectly. Try removing or changing these references, or moving the formulas to different cells."
Sep 28, 2020. A circular structure is an object that references itself. In the example below, we are referencing the object (obj) as a value for the location key.
Circular reference occurs when two or more interdependent resources cause lock condition. This makes the resource unusable. To handle the problem of circular references in C#, you should use garbage collection. It detects and collects circular references.
Check out Crockford's JSON-JS GitHub repo. It has a file, cycle.js
, which can supposedly convert objects with circular references to JSON and back using JSONPath. See the last paragraph in the repo's read me and the file's comments.
The answer here lies in understanding what data you really need to store persistently and minimizing that to only what is needed and then adding a method or function to get just that information and then saving that. I don't know your application but for a text selection, you would probably just need a persistent indication of which object it was and the start and end points of the text selection.
Then, on the restore side, you would build a function to build a selection using the data you store. It's not as simple a serialize/deserialize, but it will work.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With