{"ScriptPreparationCode":"var obj = {\r\n za: {\r\n wannabe: [\r\n \u0022Yo, I\u0027ll tell you what I want, what I really, really want\u0022,\r\n \u0022So tell me what you want, what you really, really want\u0022,\r\n \u0022I\u0027ll tell you what I want, what I really, really want\u0022,\r\n \u0022So tell me what you want, what you really, really want\u0022,\r\n \u0022I wanna, (ha) I wanna, (ha) I wanna, (ha) I wanna, (ha)\u0022,\r\n \u0022I wanna really, really, really wanna zigazig ah\u0022,\r\n ],\r\n },\r\n 12: 12,\r\n \u0022\u0022: \u0022empty\u0022,\r\n abcd: {\r\n objAsArray: {\r\n 0: { n: \u0022val\u0022, e: \u0022val\u0022 },\r\n 1: { n: \u0022val\u0022, e: \u0022val\u0022 },\r\n 2: { n: \u0022val\u0022, e: \u0022val\u0022 },\r\n 3: { n: \u0022val\u0022, e: \u0022val\u0022 },\r\n 4: { n: \u0022val\u0022, e: \u0022val\u0022 },\r\n 5: { n: \u0022val\u0022, e: \u0022val\u0022 },\r\n 6: { n: \u0022val\u0022, e: \u0022val\u0022 },\r\n 7: { n: \u0022val\u0022, e: \u0022val\u0022 },\r\n 8: { n: \u0022val\u0022, e: \u0022val\u0022 },\r\n 9: { n: \u0022val\u0022, e: \u0022val\u0022 },\r\n 10: { n: \u0022val\u0022, e: \u0022val\u0022, r: { n: 12, 3: 3 } },\r\n },\r\n l: { id: \u0022asdfas\u0022 },\r\n array: [ 12, 3, 13, 32, 134, 1234, 5, 213, 2, 34, 5, 134, 0, 51, 234124, 12, 51, 235, 123, 4, 32, 42, 5, 235, 1235, 1253, ],\r\n \u0022\uD83D\uDE04\u0022: \u0022\uD83D\uDCA9\u0022,\r\n \u0022-0\u0022: 123,\r\n },\r\n};\r\n\r\n\r\nfunction customcanonicalize(_, value) {\r\n if (value === null || typeof value !== \u0027object\u0027 || Array.isArray(value)) {\r\n return value;\r\n }\r\n\r\n var keys = Object.keys(value).sort();\r\n var length = keys.length;\r\n var object = {};\r\n\r\n for (var i = 0; i \u003C length; i\u002B\u002B) {\r\n object[keys[i]] = value[keys[i]];\r\n }\r\n\r\n return object;\r\n}\r\n\r\nfunction customStringify(obj) {\r\n return JSON.stringify(obj, customcanonicalize);\r\n};\r\n\r\n\r\nvar canonicalize = function(object) {\r\n\r\n var buffer = \u0027\u0027;\r\n serialize(object);\r\n return buffer;\r\n\r\n function serialize(object) {\r\n if (object !== null \u0026\u0026 typeof object === \u0027object\u0027) {\r\n if (Array.isArray(object)) {\r\n buffer \u002B= \u0027[\u0027;\r\n let next = false;\r\n // Array - Maintain element order\r\n object.forEach((element) =\u003E {\r\n if (next) {\r\n buffer \u002B= \u0027,\u0027;\r\n }\r\n next = true;\r\n // Recursive call\r\n serialize(element);\r\n });\r\n buffer \u002B= \u0027]\u0027;\r\n } else {\r\n buffer \u002B= \u0027{\u0027;\r\n let next = false;\r\n // Object - Sort properties before serializing\r\n Object.keys(object).sort().forEach((property) =\u003E {\r\n if (next) {\r\n buffer \u002B= \u0027,\u0027;\r\n }\r\n next = true;\r\n // Properties are just strings - Use ES6\r\n buffer \u002B= JSON.stringify(property);\r\n buffer \u002B= \u0027:\u0027;\r\n // Recursive call\r\n serialize(object[property]);\r\n });\r\n buffer \u002B= \u0027}\u0027;\r\n }\r\n } else {\r\n // Primitive data type - Use ES6\r\n buffer \u002B= JSON.stringify(object);\r\n }\r\n }\r\n};\r\n\r\nvar json = typeof JSON !== \u0027undefined\u0027 ? JSON : require(\u0027jsonify\u0027);\r\n\r\nfunction stableStringify(obj, opts) {\r\n if (!opts) opts = {};\r\n if (typeof opts === \u0027function\u0027) opts = { cmp: opts };\r\n var space = opts.space || \u0027\u0027;\r\n if (typeof space === \u0027number\u0027) space = Array(space\u002B1).join(\u0027 \u0027);\r\n var cycles = (typeof opts.cycles === \u0027boolean\u0027) ? opts.cycles : false;\r\n var replacer = opts.replacer || function(key, value) { return value; };\r\n\r\n var cmp = opts.cmp \u0026\u0026 (function (f) {\r\n return function (node) {\r\n return function (a, b) {\r\n var aobj = { key: a, value: node[a] };\r\n var bobj = { key: b, value: node[b] };\r\n return f(aobj, bobj);\r\n };\r\n };\r\n })(opts.cmp);\r\n\r\n var seen = [];\r\n return (function stringify (parent, key, node, level) {\r\n var indent = space ? (\u0027\\n\u0027 \u002B new Array(level \u002B 1).join(space)) : \u0027\u0027;\r\n var colonSeparator = space ? \u0027: \u0027 : \u0027:\u0027;\r\n\r\n if (node \u0026\u0026 node.toJSON \u0026\u0026 typeof node.toJSON === \u0027function\u0027) {\r\n node = node.toJSON();\r\n }\r\n\r\n node = replacer.call(parent, key, node);\r\n\r\n if (node === undefined) {\r\n return;\r\n }\r\n if (typeof node !== \u0027object\u0027 || node === null) {\r\n return json.stringify(node);\r\n }\r\n if (isArray(node)) {\r\n var out = [];\r\n for (var i = 0; i \u003C node.length; i\u002B\u002B) {\r\n var item = stringify(node, i, node[i], level\u002B1) || json.stringify(null);\r\n out.push(indent \u002B space \u002B item);\r\n }\r\n return \u0027[\u0027 \u002B out.join(\u0027,\u0027) \u002B indent \u002B \u0027]\u0027;\r\n }\r\n else {\r\n if (seen.indexOf(node) !== -1) {\r\n if (cycles) return json.stringify(\u0027__cycle__\u0027);\r\n throw new TypeError(\u0027Converting circular structure to JSON\u0027);\r\n }\r\n else seen.push(node);\r\n\r\n var keys = objectKeys(node).sort(cmp \u0026\u0026 cmp(node));\r\n var out = [];\r\n for (var i = 0; i \u003C keys.length; i\u002B\u002B) {\r\n var key = keys[i];\r\n var value = stringify(node, key, node[key], level\u002B1);\r\n\r\n if(!value) continue;\r\n\r\n var keyValue = json.stringify(key)\r\n \u002B colonSeparator\r\n \u002B value;\r\n ;\r\n out.push(indent \u002B space \u002B keyValue);\r\n }\r\n seen.splice(seen.indexOf(node), 1);\r\n return \u0027{\u0027 \u002B out.join(\u0027,\u0027) \u002B indent \u002B \u0027}\u0027;\r\n }\r\n })({ \u0027\u0027: obj }, \u0027\u0027, obj, 0);\r\n};\r\n\r\nvar isArray = Array.isArray || function (x) {\r\n return {}.toString.call(x) === \u0027[object Array]\u0027;\r\n};\r\n\r\nvar objectKeys = Object.keys || function (obj) {\r\n var has = Object.prototype.hasOwnProperty || function () { return true };\r\n var keys = [];\r\n for (var key in obj) {\r\n if (has.call(obj, key)) keys.push(key);\r\n }\r\n return keys;\r\n};\r\n\r\nfunction fastStableStringify(data, opts) {\r\n if (!opts) opts = {};\r\n if (typeof opts === \u0027function\u0027) opts = { cmp: opts };\r\n var cycles = (typeof opts.cycles === \u0027boolean\u0027) ? opts.cycles : false;\r\n\r\n var cmp = opts.cmp \u0026\u0026 (function (f) {\r\n return function (node) {\r\n return function (a, b) {\r\n var aobj = { key: a, value: node[a] };\r\n var bobj = { key: b, value: node[b] };\r\n return f(aobj, bobj);\r\n };\r\n };\r\n })(opts.cmp);\r\n\r\n var seen = [];\r\n return (function stringify (node) {\r\n if (node \u0026\u0026 node.toJSON \u0026\u0026 typeof node.toJSON === \u0027function\u0027) {\r\n node = node.toJSON();\r\n }\r\n\r\n if (node === undefined) return;\r\n if (typeof node == \u0027number\u0027) return isFinite(node) ? \u0027\u0027 \u002B node : \u0027null\u0027;\r\n if (typeof node !== \u0027object\u0027) return JSON.stringify(node);\r\n\r\n var i, out;\r\n if (Array.isArray(node)) {\r\n out = \u0027[\u0027;\r\n for (i = 0; i \u003C node.length; i\u002B\u002B) {\r\n if (i) out \u002B= \u0027,\u0027;\r\n out \u002B= stringify(node[i]) || \u0027null\u0027;\r\n }\r\n return out \u002B \u0027]\u0027;\r\n }\r\n\r\n if (node === null) return \u0027null\u0027;\r\n\r\n if (seen.indexOf(node) !== -1) {\r\n if (cycles) return JSON.stringify(\u0027__cycle__\u0027);\r\n throw new TypeError(\u0027Converting circular structure to JSON\u0027);\r\n }\r\n\r\n var seenIndex = seen.push(node) - 1;\r\n var keys = Object.keys(node).sort(cmp \u0026\u0026 cmp(node));\r\n out = \u0027\u0027;\r\n for (i = 0; i \u003C keys.length; i\u002B\u002B) {\r\n var key = keys[i];\r\n var value = stringify(node[key]);\r\n\r\n if (!value) continue;\r\n if (out) out \u002B= \u0027,\u0027;\r\n out \u002B= JSON.stringify(key) \u002B \u0027:\u0027 \u002B value;\r\n }\r\n seen.splice(seenIndex, 1);\r\n return \u0027{\u0027 \u002B out \u002B \u0027}\u0027;\r\n })(data);\r\n};\r\n\r\nfunction fasterStableStringify(data) {\r\n var seen = [];\r\n return (function stringify (node) {\r\n if (node \u0026\u0026 node.toJSON \u0026\u0026 typeof node.toJSON === \u0027function\u0027) {\r\n node = node.toJSON();\r\n }\r\n\r\n if (node === undefined) return;\r\n if (typeof node == \u0027number\u0027) return isFinite(node) ? \u0027\u0027 \u002B node : \u0027null\u0027;\r\n if (typeof node !== \u0027object\u0027) return JSON.stringify(node);\r\n\r\n var i, out;\r\n if (Array.isArray(node)) {\r\n out = \u0027[\u0027;\r\n for (i = 0; i \u003C node.length; i\u002B\u002B) {\r\n if (i) out \u002B= \u0027,\u0027;\r\n out \u002B= stringify(node[i]) || \u0027null\u0027;\r\n }\r\n return out \u002B \u0027]\u0027;\r\n }\r\n\r\n if (node === null) return \u0027null\u0027;\r\n\r\n if (seen.indexOf(node) !== -1) {\r\n throw new TypeError(\u0027Converting circular structure to JSON\u0027);\r\n }\r\n\r\n var seenIndex = seen.push(node) - 1;\r\n var keys = Object.keys(node).sort();\r\n out = \u0027\u0027;\r\n for (i = 0; i \u003C keys.length; i\u002B\u002B) {\r\n var key = keys[i];\r\n var value = stringify(node[key]);\r\n\r\n if (!value) continue;\r\n if (out) out \u002B= \u0027,\u0027;\r\n out \u002B= JSON.stringify(key) \u002B \u0027:\u0027 \u002B value;\r\n }\r\n seen.splice(seenIndex, 1);\r\n return \u0027{\u0027 \u002B out \u002B \u0027}\u0027;\r\n })(data);\r\n}\r\n\r\nfunction davidStringify(obj) {\r\n const allObjectKeys = getAllKeys(obj);\r\n\r\n return JSON.stringify(obj, allObjectKeys.sort());\r\n}\r\n\r\nfunction getAllKeys(obj) {\r\n let keys = [];\r\n\r\n Object.entries(obj).forEach(([key, value]) =\u003E {\r\n keys.push(key);\r\n\r\n if (value \u0026\u0026 typeof value === \u0027object\u0027) {\r\n keys = keys.concat(getAllKeys(value));\r\n }\r\n });\r\n\r\n return keys;\r\n}\r\n","TestCases":[{"Name":"Current implementation","Code":"customStringify(obj)","IsDeferred":false},{"Name":"json-stable-stringify","Code":"stableStringify(obj)","IsDeferred":false},{"Name":"fast-json-stable-stringify","Code":"fastStableStringify(obj)","IsDeferred":false},{"Name":"david-stringify","Code":"davidStringify(obj)","IsDeferred":false},{"Name":"json-canonicalization","Code":"canonicalize(obj)","IsDeferred":false},{"Name":"faster-json-stable-stringify","Code":"fasterStableStringify(obj)","IsDeferred":false}]}