{"ScriptPreparationCode":"function randomHash() {\r\n return Math.random().toString(36).substring(2, 12);\r\n}\r\n\r\nfunction generateDataset(size) {\r\n const contactsToSync = [];\r\n const syncedContacts = [];\r\n\r\n const phoneHashes = [];\r\n const emailHashes = [];\r\n\r\n for (let i = 0; i \u003C size; i\u002B\u002B) {\r\n const phoneHash = randomHash();\r\n const emailHash = randomHash();\r\n\r\n phoneHashes.push(phoneHash);\r\n emailHashes.push(emailHash);\r\n\r\n contactsToSync.push({\r\n name: \u0022Contact \u0022 \u002B i,\r\n phoneNumberHashed: phoneHash,\r\n emailAddressHashed: emailHash,\r\n });\r\n }\r\n\r\n for (let i = 0; i \u003C size; i\u002B\u002B) {\r\n const usePhone = Math.random() \u003E 0.5;\r\n\r\n syncedContacts.push({\r\n matched_by: {\r\n phone_hash: usePhone\r\n ? phoneHashes[Math.floor(Math.random() * size)]\r\n : undefined,\r\n email_hash: !usePhone\r\n ? emailHashes[Math.floor(Math.random() * size)]\r\n : undefined,\r\n },\r\n contact: {\r\n paytag: \u0022user_\u0022 \u002B i,\r\n },\r\n });\r\n }\r\n\r\n return { contactsToSync, syncedContacts };\r\n}\r\n\r\nvar { contactsToSync, syncedContacts } = generateDataset(500);\r\n\r\n","TestCases":[{"Name":"multiple iterations","Code":"/*When writing async/deferred tests, use \u0060deferred.resolve()\u0060 to mark test as done*/\r\nlet matchedPhoneNumberHashes = [];\r\n let matchedEmailAddressHashes = [];\r\n\r\n let paytagToContactBookNameMap = {};\r\n\r\n\r\n matchedPhoneNumberHashes = syncedContacts\r\n .map((contact) =\u003E contact.matched_by.phone_hash)\r\n .filter((item) =\u003E !!item);\r\n matchedEmailAddressHashes = syncedContacts\r\n .map((contact) =\u003E contact.matched_by.email_hash)\r\n .filter((item) =\u003E !!item);\r\n\r\n syncedContacts.forEach((syncedContact) =\u003E {\r\n const contactBookName = contactsToSync.find(\r\n (contact) =\u003E\r\n contact.phoneNumberHashed === syncedContact.matched_by.phone_hash ||\r\n contact.emailAddressHashed === syncedContact.matched_by.email_hash,\r\n )?.name;\r\n if (contactBookName) {\r\n paytagToContactBookNameMap[syncedContact.contact.paytag] =\r\n contactBookName;\r\n }\r\n });\r\n ","IsDeferred":false},{"Name":"Single iteration","Code":"let matchedPhoneNumberHashes = [];\r\nlet matchedEmailAddressHashes = [];\r\nlet paytagToContactBookNameMap = {};\r\n\r\n// Build fast lookup tables once\r\nlet phoneHashToName = new Map();\r\nlet emailHashToName = new Map();\r\n\r\nfor (const contact of contactsToSync) {\r\n if (contact.phoneNumberHashed \u0026\u0026 !phoneHashToName.has(contact.phoneNumberHashed)) {\r\n phoneHashToName.set(contact.phoneNumberHashed, contact.name);\r\n }\r\n\r\n if (contact.emailAddressHashed \u0026\u0026 !emailHashToName.has(contact.emailAddressHashed)) {\r\n emailHashToName.set(contact.emailAddressHashed, contact.name);\r\n }\r\n}\r\n\r\n// Single pass over syncedContacts\r\nfor (const syncedContact of syncedContacts) {\r\n const phoneHash = syncedContact.matched_by.phone_hash;\r\n const emailHash = syncedContact.matched_by.email_hash;\r\n\r\n if (phoneHash) matchedPhoneNumberHashes.push(phoneHash);\r\n if (emailHash) matchedEmailAddressHashes.push(emailHash);\r\n\r\n const contactBookName =\r\n (phoneHash ? phoneHashToName.get(phoneHash) : undefined) ??\r\n (emailHash ? emailHashToName.get(emailHash) : undefined);\r\n\r\n if (contactBookName) {\r\n paytagToContactBookNameMap[syncedContact.contact.paytag] = contactBookName;\r\n }\r\n}","IsDeferred":false}]}