{"ScriptPreparationCode":"var MyObject = {\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 myCopy = null;\r\n","TestCases":[{"Name":"Lodash cloneDeep","Code":"myCopy = _.cloneDeep(MyObject);","IsDeferred":false},{"Name":"Json clone","Code":"myCopy = JSON.parse(JSON.stringify(MyObject));","IsDeferred":false},{"Name":"Ramda clone","Code":"myCopy = R.clone(MyObject);","IsDeferred":false},{"Name":"hand rolled","Code":"const cp=(obj)=\u003E\u0022object\u0022 === typeof obj ? Object.fromEntries(Object.entries(obj).map(([k,v])=\u003E[k,cp(v)])) : obj\r\n\r\nmyCopy = cp(MyObject)","IsDeferred":false},{"Name":"spread","Code":"myCopy = {...MyObject}","IsDeferred":false},{"Name":"obj.assign","Code":"myCopy = Object.assign({}, MyObject)","IsDeferred":false},{"Name":"og hand rolled (still recursive)","Code":"const cp_old=(obj)=\u003E{\r\n if (\u0022object\u0022 !== typeof obj) {\r\n return obj\r\n } else {\r\n const entries = Object.entries(obj)\r\n for(let i = 0; i \u003C entries.length; i\u002B\u002B) {\r\n entries[i][2] = cp_old(entries[i][2])\r\n }\r\n return Object.fromEntries(entries)\r\n }\r\n}\r\nmyCopy = cp_old(MyObject)","IsDeferred":false},{"Name":"manual stack","Code":"const cp_stack=(obj)=\u003E{\r\n if (\u0022object\u0022 !== typeof obj) {\r\n return obj\r\n } else {\r\n const stack = []\r\n let entries = Object.entries(obj)\r\n let i=0\r\n stackloop: while(true) {\r\n \tfor(; i \u003C entries.length; i\u002B\u002B) {\r\n \t\tconst entry = entries[i][2]\r\n \t\tif (\u0022object\u0022 !== typeof entry) continue\r\n else {\r\n stack.push([i,entries])\r\n entries = Object.entries(entries[i][2])\r\n i = 0\r\n continue stackloop\r\n }\r\n \t}\r\n if (stack.length === 0) break\r\n [i, entries] = stack.pop()\r\n }\r\n return Object.fromEntries(entries)\r\n }\r\n}\r\nmyCopy = cp_stack(MyObject)","IsDeferred":false}]}