{"ScriptPreparationCode":"var MyObject2 = {\r\n description: \u0027Creates a deep copy of source, which should be an object or an array.\u0027,\r\n myNumber: 123456789,\r\n myBoolean: true,\r\n jayson: {\r\n stringify: \u0027JSON.stringify() method converts a JavaScript value to a JSON string....\u0027,\r\n parse: \u0027JSON.parse() method parses a JSON string...\u0027\r\n }\r\n};\r\n\r\nvar MyObject = {\r\n \u0022userId\u0022: \u0022134374683951759360\u0022,\r\n \u0022guild\u0022: \u002286908735326281728\u0022,\r\n \u0022status\u0022: \u0022online\u0022,\r\n \u0022activities\u0022: [{\r\n \u0022name\u0022: \u0022Twitch\u0022,\r\n \u0022type\u0022: 1,\r\n \u0022url\u0022: \u0022https://www.twitch.tv/craggle25\u0022,\r\n \u0022details\u0022: \u0022Weekend dirt naps with @mart0k and Cat. Hunt Showdown\u0022,\r\n \u0022state\u0022: \u0022Hunt: Showdown\u0022,\r\n \u0022applicationId\u0022: null,\r\n \u0022timestamps\u0022: null,\r\n \u0022party\u0022: null,\r\n \u0022assets\u0022: {\r\n \u0022largeText\u0022: null,\r\n \u0022smallText\u0022: null,\r\n \u0022largeImage\u0022: \u0022twitch:craggle25\u0022,\r\n \u0022smallImage\u0022: null\r\n },\r\n \u0022flags\u0022: 0,\r\n \u0022emoji\u0022: null,\r\n \u0022buttons\u0022: [],\r\n \u0022createdTimestamp\u0022: 1697880668811\r\n }],\r\n \u0022clientStatus\u0022: {\r\n \u0022desktop\u0022: \u0022online\u0022\r\n }\r\n};\r\n\r\nvar myCopy = null;\r\n\r\nfunction deepCopy(data) {\r\n let node;\r\n if (Array.isArray(data)) {\r\n node = data.length \u003E 0 ? data.slice(0) : [];\r\n node.forEach((e, i) =\u003E {\r\n if (typeof e === \u0027object\u0027 || (Array.isArray(e) \u0026\u0026 e.length \u003E 0)) {\r\n node[i] = deepCopy(e);\r\n }\r\n });\r\n } else if (data \u0026\u0026 typeof data === \u0027object\u0027) {\r\n node = data instanceof Date ? data : Object.assign({}, data);\r\n Object.keys(node).forEach(key =\u003E {\r\n if (typeof node[key] === \u0027object\u0027 || (Array.isArray(node[key]) \u0026\u0026 node[key].length \u003E 0)) {\r\n node[key] = deepCopy(node[key]);\r\n }\r\n });\r\n } else {\r\n node = data;\r\n }\r\n return node;\r\n // structuredClone(data)\r\n}\r\n\r\nfunction isArr(x) {\r\n return Array.isArray(x);\r\n}\r\n\r\nfunction isObject(x) {\r\n return typeof x === \u0027object\u0027;\r\n}\r\n\r\nfunction shallowClone(obj) {\r\n let clone = {};\r\n for (let key in obj) {\r\n let r = obj[key];\r\n let isArray = isArr(r);\r\n if (!isArray \u0026\u0026 isObject(r)) {\r\n continue;\r\n }\r\n if (isArray) {\r\n clone[key] = [];\r\n for (let i = 0; i \u003C r.length; i\u002B\u002B) {\r\n clone[key][i] = shallowClone(r[i]);\r\n }\r\n } else {\r\n clone[key] = r;\r\n }\r\n }\r\n return clone;\r\n}\r\n// pulled this from https://github.com/nodejs/node/issues/34355#issuecomment-658394617\r\nfunction deepClone(o) {\r\n if (typeof o !== \u0022object\u0022) {\r\n return o\r\n }\r\n if (!o) {\r\n return o\r\n }\r\n // https://jsperf.com/deep-copy-vs-json-stringify-json-parse/25\r\n if (Array.isArray(o)) {\r\n const newO = []\r\n for (let i = 0; i \u003C o.length; i \u002B= 1) {\r\n const val = !o[i] || typeof o[i] !== \u0022object\u0022 ? o[i] : deepClone(o[i])\r\n newO[i] = val === undefined ? null : val\r\n }\r\n return newO\r\n }\r\n const newO = {}\r\n for (const i of Object.keys(o)) {\r\n const val = !o[i] || typeof o[i] !== \u0022object\u0022 ? o[i] : deepClone(o[i])\r\n if (val === undefined) {\r\n continue\r\n }\r\n newO[i] = val\r\n }\r\n return newO\r\n}\r\nlet iterations = [100, 10000, 1000000, 10000000];\r\n\r\nfunction profile(name, func) {\r\n for (let iterationCount of iterations) {\r\n let n = name \u002B \u0022 at \u0022 \u002B iterationCount \u002B \u0022 iterations\u0022;\r\n console.time(n);\r\n for (let i = 0; i \u003C iterationCount; i\u002B\u002B) {\r\n func();\r\n }\r\n console.timeEnd(n);\r\n }\r\n console.log(\u0022\u0022);\r\n}\r\nprofile(\u0027StructuredClone\u0027, () =\u003E {\r\n structuredClone(MyObject);\r\n});\r\nprofile(\u0027ParseStringify\u0027, () =\u003E {\r\n JSON.parse(JSON.stringify(MyObject))\r\n});\r\nprofile(\u0027ShallowClone\u0027, () =\u003E {\r\n shallowClone(MyObject);\r\n});\r\nprofile(\u0027DeepClone\u0027, () =\u003E {\r\n deepClone(MyObject);\r\n});\r\nprofile(\u0027DeepCopy\u0027, () =\u003E {\r\n deepCopy(MyObject);\r\n});\r\nprofile(\u0027lodash\u0027, () =\u003E {\r\n _.cloneDeep(MyObject);\r\n});","TestCases":[{"Name":"Lodash cloneDeep","Code":"myCopy = _.cloneDeep(MyObject);","IsDeferred":false},{"Name":"Native structuredClone","Code":"myCopy = structuredClone(MyObject);","IsDeferred":false},{"Name":"DeepCopy","Code":"myCopy = deepCopy(MyObject);","IsDeferred":false}]}