{"ScriptPreparationCode":"window.foo = [\u0027cat\u0027, \u0027dog\u0027, \u0027bird\u0027];\r\nwindow.bar = [\u0027cat\u0027, \u0027dog\u0027, \u0027bird\u0027];\r\n\r\n// Simple circular detection, shouldn\u0027t be a problem in react-hook-form values.\r\n// Hopefull 1_000 is deeper than we\u0027ll ever actually go...\r\nconst DEPTH_LIMIT = 1_000;\r\n\r\nconst isPlainObject = (thing) =\u003E Boolean(\r\n thing\r\n \u0026\u0026 typeof thing === \u0027object\u0027\r\n \u0026\u0026 (\r\n thing.constructor === Object\r\n || thing.constructor === null\r\n ),\r\n);\r\n\r\nconst areValuesEqualInternal = (referenceValue, checkValue, depth) =\u003E {\r\n if (referenceValue === checkValue) {\r\n return true;\r\n }\r\n\r\n if (\r\n depth === DEPTH_LIMIT\r\n || referenceValue === null\r\n || checkValue === null\r\n || referenceValue === undefined\r\n || checkValue === undefined\r\n ) {\r\n return false;\r\n }\r\n\r\n const referenceIsArray = Array.isArray(referenceValue);\r\n const checkIsArray = Array.isArray(checkValue);\r\n if (referenceIsArray \u0026\u0026 checkIsArray) {\r\n if (referenceValue.length !== checkValue.length) {\r\n return false;\r\n }\r\n for (let i = 0; i \u003C referenceValue.length; i \u002B= 1) {\r\n if (!areValuesEqualInternal(referenceValue[i], checkValue[i], depth \u002B 1)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n // if either value is an array, but the other is not, they are not equal\r\n if (referenceIsArray || checkIsArray) {\r\n return false;\r\n }\r\n\r\n if (isPlainObject(referenceValue) \u0026\u0026 isPlainObject(checkValue)) {\r\n // check all keys in the reference value are in the check\r\n // missing keys in the check are ok if the reference value is undefined\r\n const referenceKeys = Object.keys(referenceValue);\r\n for (let i = 0; i \u003C referenceKeys.length; i \u002B= 1) {\r\n const key = referenceKeys[i];\r\n if (!areValuesEqualInternal(referenceValue[key], checkValue[key], depth \u002B 1)) {\r\n return false;\r\n }\r\n }\r\n\r\n // check if there are any keys in checkValue (not undefined value), but not in referenceValue\r\n const checkKeys = Object.keys(checkValue);\r\n for (let i = 0; i \u003C checkKeys.length; i \u002B= 1) {\r\n const key = checkKeys[i];\r\n if (checkValue[key] !== undefined \u0026\u0026 !(key in referenceValue)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n};\r\n\r\nconst areValuesEqual = (referenceValue, checkValue) =\u003E {\r\n if (referenceValue === checkValue) {\r\n return true;\r\n }\r\n return areValuesEqualInternal(referenceValue, checkValue, 1);\r\n};\r\nwindow.areValuesEqual = areValuesEqual","TestCases":[{"Name":"_.isEqual","Code":"_.isEqual(window.foo, window.bar)","IsDeferred":false},{"Name":"JSON.stringify","Code":"JSON.stringify(window.foo) === JSON.stringify(window.bar);","IsDeferred":false},{"Name":"areValuesEqual","Code":"areValuesEqual(window.foo, window.bar)","IsDeferred":false}]}