Last active
June 2, 2021 15:44
-
-
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)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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