{"ScriptPreparationCode":"var a=[];\r\nvar b=[];\r\n\r\nfor (var i = 0; i \u003C 1024; i\u002B\u002B) {\r\n a[i] = i;\r\n b[i] = i;\r\n}\r\n\r\n\r\n// ###############################################\r\n// # https://stackoverflow.com/a/16436975/2601293\r\n// ###############################################\r\nfunction arraysEqual(a, b) {\r\n if (a === b) return true;\r\n if (a == null || b == null) return false;\r\n if (a.length != b.length) return false;\r\n\r\n // If you don\u0027t care about the order of the elements inside\r\n // the array, you should sort both arrays here.\r\n // Please note that calling sort on an array will modify that array.\r\n // you might want to clone your array first.\r\n\r\n for (var i = 0; i \u003C a.length; \u002B\u002Bi) {\r\n if (a[i] !== b[i]) return false;\r\n }\r\n return true;\r\n}\r\n\r\n\r\n// ###############################################\r\n// # https://stackoverflow.com/a/10316616/2601293 (Option 1)\r\n// ###############################################\r\nfunction arraysEqual(a1,a2) {\r\n /* WARNING: arrays must not contain {objects} or behavior may be undefined */\r\n return JSON.stringify(a1)==JSON.stringify(a2);\r\n}\r\n\r\n// #########################################################\r\n// # https://stackoverflow.com/a/10316616/2601293 (Option 2)\r\n// #########################################################\r\n// generally useful functions\r\nfunction type(x) { // does not work in general, but works on JSONable objects we care about... modify as you see fit\r\n // e.g. type(/asdf/g) --\u003E \u0022[object RegExp]\u0022\r\n return Object.prototype.toString.call(x);\r\n}\r\nfunction zip(arrays) {\r\n // e.g. zip([[1,2,3],[4,5,6]]) --\u003E [[1,4],[2,5],[3,6]]\r\n return arrays[0].map(function(_,i){\r\n return arrays.map(function(array){return array[i]})\r\n });\r\n}\r\n// helper functions\r\nfunction allCompareEqual(array) {\r\n // e.g. allCompareEqual([2,2,2,2]) --\u003E true\r\n // does not work with nested arrays or objects\r\n return array.every(function(x){return x==array[0]});\r\n}\r\n\r\nfunction isArray(x){ return type(x)==type([]) }\r\nfunction getLength(x){ return x.length }\r\nfunction allTrue(array){ return array.reduce(function(a,b){return a\u0026\u0026b},true) }\r\nfunction allDeepEqual(things) {\r\n // works with nested arrays\r\n if( things.every(isArray) )\r\n return allCompareEqual(things.map(getLength)) // all arrays of same length\r\n \u0026\u0026 allTrue(zip(things).map(allDeepEqual)); // elements recursively equal\r\n //else if( this.every(isObject) )\r\n // return {all have exactly same keys, and for \r\n // each key k, allDeepEqual([o1[k],o2[k],...])}\r\n // e.g. ... \u0026\u0026 allTrue(objectZip(objects).map(allDeepEqual)) \r\n\r\n //else if( ... )\r\n // extend some more\r\n else\r\n return allCompareEqual(things);\r\n}\r\nfunction allDeepEqual2() {\r\n return allDeepEqual([].slice.call(arguments));\r\n}\r\n\r\n// #########################################################\r\n// # https://stackoverflow.com/a/10316616/2601293 (Option 3)\r\n// #########################################################\r\nfunction optionThree(a,b) {\r\n /*\r\n Array-aware equality checker:\r\n Returns whether arguments a and b are == to each other;\r\n however if they are equal-lengthed arrays, returns whether their \r\n elements are pairwise == to each other recursively under this\r\n definition.\r\n */\r\n if (a instanceof Array \u0026\u0026 b instanceof Array) {\r\n if (a.length!=b.length) // assert same length\r\n return false;\r\n for(var i=0; i\u003Ca.length; i\u002B\u002B) // assert each element equal\r\n if (!arraysEqual(a[i],b[i]))\r\n return false;\r\n return true;\r\n } else {\r\n return a==b; // if not both arrays, should be the same\r\n }\r\n}\r\n\r\n\r\n// #########################################################\r\n// # https://stackoverflow.com/a/10316616/2601293 (Option 4)\r\n// #########################################################\r\nfunction deepEquals(a,b) {\r\n if (a instanceof Array \u0026\u0026 b instanceof Array)\r\n return arraysEqual(a,b);\r\n if (Object.getPrototypeOf(a)===Object.prototype \u0026\u0026 Object.getPrototypeOf(b)===Object.prototype)\r\n return objectsEqual(a,b);\r\n if (a instanceof Map \u0026\u0026 b instanceof Map)\r\n return mapsEqual(a,b); \r\n if (a instanceof Set \u0026\u0026 b instanceof Set)\r\n throw \u0022Error: set equality by hashing not implemented.\u0022\r\n if ((a instanceof ArrayBuffer || ArrayBuffer.isView(a)) \u0026\u0026 (b instanceof ArrayBuffer || ArrayBuffer.isView(b)))\r\n return typedArraysEqual(a,b);\r\n return a==b; // see note[1] -- IMPORTANT\r\n}\r\n\r\nfunction arraysEqual(a,b) {\r\n if (a.length!=b.length)\r\n return false;\r\n for(var i=0; i\u003Ca.length; i\u002B\u002B)\r\n if (!deepEquals(a[i],b[i]))\r\n return false;\r\n return true;\r\n}\r\nfunction objectsEqual(a,b) {\r\n var aKeys = Object.getOwnPropertyNames(a);\r\n var bKeys = Object.getOwnPropertyNames(b);\r\n if (aKeys.length!=bKeys.length)\r\n return false;\r\n aKeys.sort();\r\n bKeys.sort();\r\n for(var i=0; i\u003CaKeys.length; i\u002B\u002B)\r\n if (aKeys[i]!=bKeys[i]) // keys must be strings\r\n return false;\r\n return deepEquals(aKeys.map(k=\u003Ea[k]), aKeys.map(k=\u003Eb[k]));\r\n}\r\nfunction mapsEqual(a,b) {\r\n if (a.size!=b.size)\r\n return false;\r\n var aPairs = Array.from(a);\r\n var bPairs = Array.from(b);\r\n aPairs.sort((x,y) =\u003E x[0]\u003Cy[0]);\r\n bPairs.sort((x,y) =\u003E x[0]\u003Cy[0]);\r\n for(var i=0; i\u003Ca.length; i\u002B\u002B)\r\n if (!deepEquals(aPairs[i][0],bPairs[i][0]) || !deepEquals(aPairs[i][1],bPairs[i][1]))\r\n return false;\r\n return true;\r\n}\r\nfunction typedArraysEqual(a,b) {\r\n a = new Uint8Array(a);\r\n b = new Uint8Array(b);\r\n if (a.length != b.length)\r\n return false;\r\n for(var i=0; i\u003Ca.length; i\u002B\u002B)\r\n if (a[i]!=b[i])\r\n return false;\r\n return true;\r\n}","TestCases":[{"Name":"lodash isEqual","Code":"_.isEqual(a, b)","IsDeferred":false},{"Name":"arraysEqual","Code":"arraysEqual(a, b)","IsDeferred":false},{"Name":"JSON.stringify (WONT WORK WITH OBJECTS)","Code":"arraysEqual(a, b)","IsDeferred":false},{"Name":"Option 2","Code":"allDeepEqual2(a, b)","IsDeferred":false},{"Name":"option 3","Code":"optionThree(a,b)","IsDeferred":false},{"Name":"Option 4","Code":"deepEquals(a,b)","IsDeferred":false}]}