Skip to content

Instantly share code, notes, and snippets.

@mirabilos
Last active June 2, 2021 15:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mirabilos/fa392859d29399e6b53523582f7cf793 to your computer and use it in GitHub Desktop.
Save mirabilos/fa392859d29399e6b53523582f7cf793 to your computer and use it in GitHub Desktop.
example pre-ES6 (should work on ES3) code to check for recursion (to debug why JSON serialisation breaks)
// example pre-ES6 (should work on ES3) code to check for recursion (to debug why JSON serialisation breaks)
// Ⓕ CC0 by mirabilos
var subs = {
"miau": ["mrr", "purr"],
"mrr": [],
"mraw": {},
"f": false,
"t": true,
"n": null,
"r": { "recursive": false }
};
var object = {
aProperty: {
aSetting1: 1,
aSetting2: 2,
aSetting3: 3,
aSetting4: 4,
aSetting5: 5
},
bProperty: {
aFuckup: subs,
bSetting1: {
bPropertySubSetting: true
},
bSetting2: "bString"
},
cProperty: {
cSetting: "cString"
}
};
function checkRecursive(obj, valmap, reckey, recpath, key='', pfx='top') {
if (valmap === undefined)
valmap = {};
if (reckey === undefined) {
reckey = [];
recpath = [];
}
var rv = [];
if (obj && typeof(obj) === "object" &&
typeof(obj.toJSON) === "function")
obj = obj.toJSON(key);
switch (typeof(obj)) {
case "string":
case "number":
case "boolean":
case "null":
valmap[pfx] = "v:" + obj;
break;
case "object":
if (!obj) {
valmap[pfx] = "null";
break;
}
// Array or Object
var recidx = Array.prototype.indexOf.call(reckey, obj);
if (recidx != -1) {
valmap[pfx] = "recurses:" + recpath[recidx];
rv.push(recpath[recidx]);
break;
}
Array.prototype.push.call(reckey, obj);
Array.prototype.push.call(recpath, pfx);
if (Object.prototype.toString.apply(obj) === "[object Array]") {
valmap[pfx] = "[]";
var len = obj.length;
for (var i = 0; i < len; ++i) {
var r = checkRecursive(obj[i], valmap,
reckey, recpath, i, pfx + '[' + i + ']');
if (r !== false)
rv = rv.concat(r);
}
break;
}
valmap[pfx] = "{}";
for (var okey in obj)
if (Object.prototype.hasOwnProperty.call(obj, okey)) {
var r = checkRecursive(obj[okey], valmap,
reckey, recpath, okey, pfx + '.' + okey);
if (r !== false)
rv = rv.concat(r);
}
break;
default:
valmap[pfx] = "?:" + typeof(obj);
break;
}
return rv.length ? rv : false;
}
var vmap;
var isrec;
vmap = {};
isrec = checkRecursive(object, vmap);
console.log("object (1) is " + (isrec === false ? "ok" : "recursive"));
for (var k in vmap)
if (vmap.hasOwnProperty(k))
console.log(" " + k + " = " + vmap[k]);
if (isrec !== false) {
console.log("recursion in elements:");
console.log(isrec);
}
// make it recursive, then try again
subs['r'] = object;
vmap = {};
isrec = checkRecursive(object, vmap);
console.log("object (2) is " + (isrec === false ? "ok" : "recursive"));
for (var k in vmap)
if (vmap.hasOwnProperty(k))
console.log(" " + k + " = " + vmap[k]);
if (isrec !== false) {
console.log("recursion in elements:");
console.log(isrec);
}
// make it doubly recursive, then try again
object['rProperty'] = object['aProperty'];
vmap = {};
isrec = checkRecursive(object, vmap);
console.log("object (2) is " + (isrec === false ? "ok" : "recursive"));
for (var k in vmap)
if (vmap.hasOwnProperty(k))
console.log(" " + k + " = " + vmap[k]);
if (isrec !== false) {
console.log("recursion in elements:");
console.log(isrec);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment