{"ScriptPreparationCode":"function equal(a, b) {\r\n if (a === b) return true;\r\n\r\n if (a \u0026\u0026 b \u0026\u0026 typeof a == \u0027object\u0027 \u0026\u0026 typeof b == \u0027object\u0027) {\r\n if (a.constructor !== b.constructor) return false;\r\n\r\n var length, i, keys;\r\n if (Array.isArray(a)) {\r\n length = a.length;\r\n if (length != b.length) return false;\r\n for (i = length; i-- !== 0;)\r\n if (!equal(a[i], b[i])) return false;\r\n return true;\r\n }\r\n\r\n\r\n\r\n if (a.constructor === RegExp) return a.source === b.source \u0026\u0026 a.flags === b.flags;\r\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\r\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\r\n\r\n keys = Object.keys(a);\r\n length = keys.length;\r\n if (length !== Object.keys(b).length) return false;\r\n\r\n for (i = length; i-- !== 0;)\r\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\r\n\r\n for (i = length; i-- !== 0;) {\r\n var key = keys[i];\r\n\r\n if (!equal(a[key], b[key])) return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n // true if both NaN, false otherwise\r\n return a !== a \u0026\u0026 b !== b;\r\n};\r\n\r\n// 1 level deep\r\nvar data = [\r\n\r\n {\r\n description: \u0027empty arrays\u0027,\r\n value1: [],\r\n value2: [],\r\n equal: true,\r\n },\r\n {\r\n description: \u0027different length arrays\u0027,\r\n value1: [1, 2, 3],\r\n value2: [1, 2],\r\n equal: false,\r\n },\r\n {\r\n description: \u0027arrays with different types\u0027,\r\n value1: [1, 2, 3],\r\n value2: [\u00271\u0027, \u00272\u0027, \u00273\u0027],\r\n equal: false,\r\n },\r\n {\r\n description: \u0027arrays with null/undefined\u0027,\r\n value1: [1, null, 3],\r\n value2: [1, undefined, 3],\r\n equal: false,\r\n },\r\n {\r\n description: \u0027arrays with NaN\u0027,\r\n value1: [1, NaN, 3],\r\n value2: [1, NaN, 3],\r\n equal: true,\r\n },\r\n {\r\n description: \u0027large number arrays\u0027,\r\n value1: Array.from({\r\n length: 10000\r\n }, (_, i) =\u003E i),\r\n value2: Array.from({\r\n length: 10000\r\n }, (_, i) =\u003E i),\r\n equal: true,\r\n },\r\n {\r\n description: \u0027large string arrays\u0027,\r\n value1: Array.from({\r\n length: 1000\r\n }, (_, i) =\u003E \u0060string${i}\u0060),\r\n value2: Array.from({\r\n length: 1000\r\n }, (_, i) =\u003E \u0060string${i}\u0060),\r\n equal: true,\r\n },\r\n {\r\n description: \u0027mixed primitive arrays\u0027,\r\n value1: [1, \u0027hello\u0027, true, null, undefined, NaN],\r\n value2: [1, \u0027hello\u0027, true, null, undefined, NaN],\r\n equal: true,\r\n },\r\n {\r\n description: \u0027sparse arrays\u0027,\r\n value1: [1, , 3],\r\n value2: [1, undefined, 3],\r\n equal: false,\r\n },\r\n {\r\n description: \u0027arrays with special numbers\u0027,\r\n value1: [0, -0, Infinity, -Infinity],\r\n value2: [0, -0, Infinity, -Infinity],\r\n equal: true,\r\n },\r\n\r\n];","TestCases":[{"Name":"lodash","Code":"data.forEach((item) =\u003E {\r\n _.isEqual(item.value1, item.value2);\r\n });","IsDeferred":false},{"Name":"fast-deep-equal","Code":"data.forEach((item) =\u003E {\r\n equal(item.value1, item.value2);\r\n });","IsDeferred":false}]}