On working on a project i want to return array of names for the array of email ids i have.
const users = [ {name: 'John', email: 'john@example.com'}, {name: 'Jane', email: 'jane@example.com'}, {name: 'Bob', email: 'bob@example.com'} ]; function getNames(emailIds) { return emailIds.map((emailId)=>{ const user = users.find((user)=>{ return user.email === emailId }); return user?.name || emailId }) }
As you see the above code, the time complexity is O(n*m)
. In other words, assume the emailIds
array is of size 100 and users
array size is 1000 then the above code may run 1000*100 = 100000
, so in order to reduce the iterations
function getNames(emailIds) { const emailMap= {}; users.forEach((user)=>{ emailMap[user.email]=user.name }); return emailIds.map((emailId)=>{ return emailMap[emailId] || emailId }) }
This function first initializes an empty object emailMap
. It then iterates over the users array using the forEach()
method and stores each email-to-name mapping in the emailMap
object, where the email is the key and the name is the value.
Now the time complexity is O(n+m)
. In other words, the above code may run 1000+100 = 1100
This modified approach is faster than the original version because it reduces the number of iterations needed to find a matching user object for each email ID. Instead of searching the users array for each email ID, the function only needs to perform a single iteration over the users array to create the email-to-name mappings. Subsequent lookups are done using constant-time key lookups in the emailMap object.
Thank you for reading please leave a like and share your thoughts in the comment section.
Top comments (1)
Here's another proposition that needs to be benchmarked :