-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsafeStringify.js
More file actions
122 lines (97 loc) · 2.4 KB
/
safeStringify.js
File metadata and controls
122 lines (97 loc) · 2.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
Util = function () {}
Util.prototype = {
stringify: function (object) {
try {
return JSON.stringify(object);
} catch (e) {
this.root = {};
this.root.objects = {};
var key = this._createKey();
this.root.pointers = [];
this._circularStringify('root', object);
return JSON.stringify(this.root);
}
},
parse: function (string) {
var object = JSON.parse(string);
if(!object.objects && object.pointers){
return object;
} else {
var parsedObjects = {};
for(prop in object.objects){
parsedObjects[prop] = JSON.parse(object.objects[prop]);
}
for (var i = object.pointers.length - 1; i >= 0; i--) {
parsedObjects[object.pointers[i].origin][object.pointers[i].prop] = parsedObjects[object.pointers[i].pointer];
};
}
return parsedObjects['root'];
},
_circularStringify: function (originKey, object, start) {
var toAnalyze = [];
for(prop in object){
if(object[prop] instanceof Object){
var newObject = object[prop];
toAnalyze.push({
object: newObject,
prop: prop
});
delete object[prop];
}
}
if(!this._getExistingKey()){
this.root.objects[originKey] = JSON.stringify(object);
}
for (var i = toAnalyze.length - 1; i >= 0; i--) {
var existingKey;
try {
existingKey = this._getExistingKey(JSON.stringify(toAnalyze[i].object));
} catch (e) {
}
var pointerKey = existingKey ? existingKey : this._createKey();
this.root.pointers.push({
origin: originKey,
pointer: pointerKey,
prop: toAnalyze[i].prop
});
this._circularStringify(pointerKey, toAnalyze[i].object, false);
};
},
_getExistingKey: function (jsonString) {
for(prop in this.root.objects){
if(this.root.objects[prop] == jsonString){
// Already exists
return prop;
}
}
return false;
},
_createKey: function () {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
return v.toString(16);
});
}
}
var util = new Util();
// TESTS!
var seth = {
name: 'Seth',
age: 25,
homeTown: 'Aurora'
}
var chloe = {
name: 'Chloe',
age: 23,
homeTown: 'Japan'
}
seth.wife = chloe;
chloe.husband = seth;
var json = util.stringify(seth);
console.log(json);
var obj = util.parse(json);
console.log(obj);
console.log("Test1 - ", seth == obj);
// A = []; A[0] = A
// var json = util.stringify(A);
// console.log(json);