{"ScriptPreparationCode":"function deepEqual(obj1, obj2){\r\n\r\n // Initialisation\r\n let obj1Keys = Object.keys(obj1);\r\n let obj2Keys = Object.keys(obj2);\r\n\r\n // Check property number\r\n if(obj1Keys.length != obj2Keys.length)\r\n return false;\r\n\r\n // Check property key\r\n if(!obj1Keys.every(key =\u003E obj2[key]))\r\n return false;\r\n\r\n // Check property value\r\n {\r\n // Array containing both objects values for comparison\r\n let objValues = obj1Keys.map(key =\u003E[obj1[key], obj2[key]])\r\n\r\n // Check values type\r\n let sameType = objValues.every( value =\u003E typeof value[0] === typeof value[1]);\r\n if(!sameType)\r\n return false;\r\n\r\n // Arrays containing JS types\r\n let valueTypes = [\u0027number\u0027, \u0027string\u0027, \u0027boolean\u0027, \u0027symbol\u0027, \u0027undefined\u0027, \u0027bigint\u0027];\r\n let allTypes = [...valueTypes, \u0027null\u0027, \u0027object\u0027];\r\n\r\n // Sort [objValues] so that value types will be processed before reference types\r\n let objValuesTypeSorted = objValues.sort((a, b) =\u003E allTypes.indexOf(typeof a[0]) - allTypes.indexOf(typeof b[0]));\r\n // NB: every() is useful here to exit the loop as fast as possible\r\n let sameValues = objValuesTypeSorted.every(values =\u003E {\r\n // Check value types\r\n if(valueTypes.includes(typeof values[0]))\r\n return values[0] === values[1];\r\n\r\n // Check reference types\r\n else\r\n {\r\n if (values[0] === null \u0026\u0026 values[1] === null)\r\n return true;\r\n else if(values[0] === null \u0026\u0026 values[1] !== null || values[1] === null \u0026\u0026 values[0] !== null)\r\n return false;\r\n else\r\n return deepEqual(values[0], values[1]);\r\n }\r\n })\r\n if(!sameValues)\r\n return false;\r\n }\r\n return true;\r\n}\r\n\r\n// 1 level deep\r\nwindow.foo1 = { a: 1, b: 2, c: { a: 1, b: 2, c: { a: 1, b: 2 } } };\r\nwindow.bar1 = { a: 1, b: 3, c: { a: 1, b: 2, c: { a: 1, b: 2 } } };\r\n\r\n// 2 levels deep\r\nwindow.foo2 = { a: 1, b: 2, c: { a: 1, b: 2, c: { a: 1, b: 2 } } };\r\nwindow.bar2 = { a: 1, b: 2, c: { a: 1, b: 3, c: { a: 1, b: 2 } } };\r\n\r\n// 3 levels deep\r\nwindow.foo3 = { a: 1, b: 2, c: { a: 1, b: 2, c: { a: 1, b: 2, c: { a: 1, b: 2 } } }, d: 6 };\r\nwindow.bar3 = { a: 1, b: 2, c: { a: 1, b: 2, c: { a: 1, b: 2, c: { a: 1, z: 2 } } }, d: 6 };\r\n\r\nvar toto = {\r\n \u0022data\u0022:[\r\n {\r\n \u0022period\u0022:\u0022Month\u0022,\r\n \u0022start_date\u0022:\u00222012-06\u0022,\r\n \u0022end_date\u0022:\u00222012-07\u0022,\r\n \u0022attributes\u0022:{\r\n\r\n },\r\n \u0022measures\u0022:{\r\n \u0022Visits\u0022:1000000\r\n },\r\n \u0022SubRows\u0022:[\r\n {\r\n \u0022Unknown\u0022:{\r\n \u0022measures\u0022:{\r\n \u0022Visits\u0022:1000\r\n },\r\n \u0022SubRows\u0022:null\r\n },\r\n \u0022**\u0022:{\r\n \u0022measures\u0022:{\r\n \u0022Visits\u0022:1000\r\n },\r\n \u0022SubRows\u0022:null\r\n },\r\n \u0022Afghanistan\u0022:{\r\n \u0022measures\u0022:{\r\n \u0022Visits\u0022:1000\r\n },\r\n \u0022SubRows\u0022:null\r\n },\r\n \u0022Aland Islands\u0022:{\r\n \u0022measures\u0022:{\r\n \u0022Visits\u0022:1000\r\n },\r\n \u0022SubRows\u0022:null\r\n },\r\n \u0022Albania\u0022:{\r\n \u0022measures\u0022:{\r\n \u0022Visits\u0022:100\r\n },\r\n \u0022SubRows\u0022:null\r\n },\r\n }\r\n ],\r\n \u0022year\u0022:\u00222002\u0022\r\n }\r\n ]\r\n}\r\n\r\nvar toto1 = {\r\n \u0022data\u0022:[\r\n {\r\n \u0022period\u0022:\u0022Month\u0022,\r\n \u0022start_date\u0022:\u00222012-06\u0022,\r\n \u0022end_date\u0022:\u00222012-07\u0022,\r\n \u0022attributes\u0022:{\r\n\r\n },\r\n \u0022measures\u0022:{\r\n \u0022Visits\u0022:1000000\r\n },\r\n \u0022SubRows\u0022:[\r\n {\r\n \u0022Unknown\u0022:{\r\n \u0022measures\u0022:{\r\n \u0022Visits\u0022:1000\r\n },\r\n \u0022SubRows\u0022:null\r\n },\r\n \u0022**\u0022:{\r\n \u0022measures\u0022:{\r\n \u0022Visits\u0022:1000\r\n },\r\n \u0022SubRows\u0022:null\r\n },\r\n \u0022Afghanistan\u0022:{\r\n \u0022measures\u0022:{\r\n \u0022Visits\u0022:1000\r\n },\r\n \u0022SubRows\u0022:null\r\n },\r\n \u0022Aland Islands\u0022:{\r\n \u0022measures\u0022:{\r\n \u0022Visits\u0022:1000\r\n },\r\n \u0022SubRows\u0022:null\r\n },\r\n \u0022Albania\u0022:{\r\n \u0022measures\u0022:{\r\n \u0022Visits\u0022:100\r\n },\r\n \u0022SubRows\u0022:null\r\n },\r\n }\r\n ],\r\n \u0022year\u0022:\u00222001\u0022\r\n }\r\n ]\r\n}\r\n\r\n\r\n","TestCases":[{"Name":"lodash","Code":"_.isEqual(toto, toto1)","IsDeferred":false},{"Name":"custom-deepEqual","Code":"deepEqual(toto, toto1);","IsDeferred":false},{"Name":"JSON.stringify()","Code":"JSON.stringify(toto) === JSON.stringify(toto1);","IsDeferred":false}]}