{"ScriptPreparationCode":"function deepEqual(obj1, obj2) {\r\n if (obj1 === obj2) {\r\n return true;\r\n }\r\n if (typeof obj1 !== \u0027object\u0027 || obj1 === null || typeof obj2 !== \u0027object\u0027 || obj2 === null) {\r\n return false;\r\n }\r\n\r\n const keys1 = Object.keys(obj1);\r\n const keys2 = Object.keys(obj2);\r\n\r\n if (keys1.length !== keys2.length) {\r\n return false;\r\n }\r\n\r\n for (let key of keys1) {\r\n if (!obj2.hasOwnProperty(key) || !deepEqual(obj1[key], obj2[key])) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\n\r\n// 1 level deep\r\nvar data = [\r\n {\r\n description: \u0027equal numbers\u0027,\r\n value1: 1,\r\n value2: 1,\r\n equal: true,\r\n },\r\n {\r\n description: \u0027not equal numbers\u0027,\r\n value1: 1,\r\n value2: 2,\r\n equal: false,\r\n },\r\n {\r\n description: \u0027number and array are not equal\u0027,\r\n value1: 1,\r\n value2: [],\r\n equal: false,\r\n },\r\n {\r\n description: \u00270 and object are not equal\u0027,\r\n value1: 0,\r\n value2: {},\r\n equal: false,\r\n },\r\n {\r\n description: \u0027equal strings\u0027,\r\n value1: \u0027a\u0027,\r\n value2: \u0027a\u0027,\r\n equal: true,\r\n },\r\n {\r\n description: \u0027big object\u0027,\r\n value1: {\r\n prop1: \u0027value1\u0027,\r\n prop2: \u0027value2\u0027,\r\n prop3: \u0027value3\u0027,\r\n prop4: {\r\n subProp1: \u0027sub value1\u0027,\r\n subProp2: {\r\n subSubProp1: \u0027sub sub value1\u0027,\r\n subSubProp2: [\r\n 1,\r\n 2,\r\n { prop2: 1, prop: 2 },\r\n 4,\r\n 5,\r\n ],\r\n },\r\n },\r\n prop5: 1000,\r\n prop6: new Date(2016, 2, 10),\r\n },\r\n value2: {\r\n prop5: 1000,\r\n prop3: \u0027value3\u0027,\r\n prop1: \u0027value1\u0027,\r\n prop2: \u0027value2\u0027,\r\n prop6: new Date(\u00272016/03/10\u0027),\r\n prop4: {\r\n subProp2: {\r\n subSubProp1: \u0027sub sub value1\u0027,\r\n subSubProp2: [\r\n 1,\r\n 2,\r\n { prop2: 1, prop: 2 },\r\n 4,\r\n 5,\r\n ],\r\n },\r\n subProp1: \u0027sub value1\u0027,\r\n },\r\n },\r\n equal: true,\r\n },\r\n ];","TestCases":[{"Name":"lodash","Code":"data.forEach((item) =\u003E {\r\n _.isEqual(item.value1, item.value2);\r\n });","IsDeferred":false},{"Name":"local function","Code":"data.forEach((item) =\u003E {\r\n \r\n\r\ndeepEqual(item.value1, item.value2);\r\n });","IsDeferred":false},{"Name":"deepEqual","Code":"function deepEqual(object1, object2) {\r\n const keys1 = Object.keys(object1);\r\n const keys2 = Object.keys(object2);\r\n if (keys1.length !== keys2.length) {\r\n return false;\r\n }\r\n for (const key of keys1) {\r\n const val1 = object1[key];\r\n const val2 = object2[key];\r\n const areObjects = isObject(val1) \u0026\u0026 isObject(val2);\r\n if (\r\n areObjects \u0026\u0026 !deepEqual(val1, val2) ||\r\n !areObjects \u0026\u0026 val1 !== val2\r\n ) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\nfunction isObject(object) {\r\n return object != null \u0026\u0026 typeof object === \u0027object\u0027;\r\n}\r\n\r\ndata.forEach((item) =\u003E {\r\n deepEqual(item.value1, item.value2);\r\n });","IsDeferred":false}]}