{"ScriptPreparationCode":"async function H(m) {\r\n const msgUint8 = new TextEncoder().encode(m);\r\n const hashBuffer = await crypto.subtle.digest(\u0022SHA-256\u0022, msgUint8);\r\n const hashArray = Array.from(new Uint8Array(hashBuffer));\r\n return hashArray.map((b) =\u003E b.toString(16).padStart(2, \u00220\u0022)).join(\u0022\u0022);\r\n}\r\n\r\nfunction JSONStringifyOrdered(obj) {\r\n const allKeys = new Set();\r\n JSON.stringify(obj, (key, value) =\u003E (allKeys.add(key), value));\r\n return JSON.stringify(obj, Array.from(allKeys).sort());\r\n}\r\n\r\nasync function prepare() {\r\n window.NUM_ITEMS = 1000;\r\n window.NUM_TAKE = 20;\r\n window.input = [];\r\n window.data = [];\r\n window.indices = [...Array(window.NUM_ITEMS).keys()];\r\n\r\n // Populate data: entries with a nested array of 50 random entries\r\n for (const i of window.indices) {\r\n window.data[i] = {\r\n ids: window.indices\r\n .slice(0, 1000)\r\n .map((x) =\u003E Math.floor(Math.random() * window.NUM_ITEMS * 10)),\r\n counter: i,\r\n counter2: Math.floor(Math.random() * i),\r\n };\r\n }\r\n\r\n window.check = window.data.map((obj) =\u003E false);\r\n window.stringified = window.data.map(JSONStringifyOrdered);\r\n window.strings = new Set(window.stringified);\r\n // calculate hashes for each data object\r\n window.hashes = new Set(window.data.map(objectHash));\r\n window.stringsHashes = new Set(window.stringified.map(objectHash));\r\n\r\n window.shas = new Set(await Promise.all(\r\n window.stringified.map(async (item) =\u003E await H(item))\r\n ));\r\n\r\n window.TAKE_IDX = window.indices.reverse().slice(0, window.NUM_TAKE);\r\n // Uncomment to choose random indices\r\n //window.TAKE_IDX = window.TAKE_IDX.map((x) =\u003E Math.floor(Math.random() * window.NUM_ITEMS));\r\n\r\n // Populate input: copies of the data\r\n for (const i of window.TAKE_IDX) {\r\n window.input[i] = {\r\n ids: [...window.data[i].ids],\r\n counter: window.data[i].counter,\r\n counter2: window.data[i].counter2,\r\n };\r\n }\r\n \r\n console.log(window.TAKE_IDX);\r\n console.log(\u0022END:prepare\u0022);\r\n}\r\n\r\nconsole.log(\u0022START:prepare\u0022);\r\nprepare();","TestCases":[{"Name":"Iteration \u002B _.isEqual","Code":"for (const i of window.TAKE_IDX) {\r\n window.check[i] = window.data.some((item) =\u003E _.isEqual(item, window.input[i]));\r\n}","IsDeferred":false},{"Name":"Iteration \u002B JSON.stringify","Code":"for (const i of window.TAKE_IDX) {\r\n window.check[i] = window.stringified.some((item) =\u003E item === JSONStringifyOrdered(window.input[i]));\r\n}","IsDeferred":false},{"Name":"Set \u002B objectHash","Code":"for (const i of window.TAKE_IDX) {\r\n window.check[i] = window.hashes.has(objectHash(window.input[i]));\r\n}","IsDeferred":false},{"Name":"Set \u002B JSON.stringify","Code":"for (const i of window.TAKE_IDX) {\r\n window.check[i] = window.strings.has(JSONStringifyOrdered(window.input[i]));\r\n}","IsDeferred":false},{"Name":"Set \u002B JSON.stringify \u002B native SHA","Code":"async function testNativeHash() {\r\n for (const i of window.TAKE_IDX) {\r\n window.check[i] = window.shas.has(await H(JSONStringifyOrdered(window.input[i])));\r\n }\r\n}\r\n\r\ntestNativeHash();","IsDeferred":false}]}