DEV Community

MR.H
MR.H

Posted on

I reduced loop from 100K to 1K

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
   })
}
Enter fullscreen mode Exit fullscreen mode

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
   })
}
Enter fullscreen mode Exit fullscreen mode

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.

Happy Coding

Top comments (1)

Collapse
 
dallgoot profile image
dallgoot • Edited

Here's another proposition that needs to be benchmarked :

function getNames(emailIds) {
   const emailSet = new Set(emailIds);

   return users.
       filter((user) => emailsSet.has(user.email)}).
       map(user => (user.name || user.email));
}
Enter fullscreen mode Exit fullscreen mode