Unique Email Addresses
I don't know what you mean by declarative in this case. All these functions are pure (except the console.log), but the implementations of the functions are all imperative (which is fine of course)
When adding to a set, you don't need to check if the key exists first. Just add it.
Splitting the string into an array of chars isn't necessary. You can use string utils instead, for example indexOf('+'). You can also do a split('+')[0] to avoid having the iPlus variable.
If you swap the reduce for a map, and wrap that in a Set, you don't need to add to set explicitly. It's probably a bit slower though.
You could add some more newlines to the code to group related concepts, and make it more readable


I came up with the solution below:

const getUniqueEmailKey = email =&gt; {
    const [local, domain] = email.split('@')
    return local
        .split('+')[0] // Take everything before +
        .split('.').join('') // Remove dots
        + '@' + domain
}

const numUniqueEmails = emails =&gt; new Set(emails.map(getUniqueEmailKey)).size


About leetcode:
Try running the code a few more times. The time you get is a bit random...