如何在JavaScript中按指定域名过滤邮箱列表并统计域名数量?
解决邮箱域名统计的逻辑问题
嘿,我来帮你搞定这个统计域名次数的问题~你当前代码里的reduce部分逻辑确实有问题,咱们一步步拆解修正:
原代码的问题分析
你这行代码acc[email] = (acc[email] === domains.includes(email.split('@')[1]));存在两个核心问题:
- 你把整个邮箱地址作为了累加对象的键,但我们需要统计的是域名的出现次数,不是邮箱本身
- 赋值的逻辑是个布尔判断,完全没有实现“计数累加”的效果,这会导致结果全是
true/false,完全不符合需求
修正后的完整代码
我们需要调整reduce里的逻辑,把域名作为键,每次遇到相同域名就累加计数:
const emails = ['info@gmail.com','info@hotmail.com','admin@host.com','felix@hotmail.com','alex123@host.com']; const domains = ['gmail.com','hotmail.com']; const countDomains = (emails) => { return emails .filter(email => domains.includes(email.split('@')[1])) .reduce((acc, email) => { // 提取当前邮箱的域名 const domain = email.split('@')[1]; // 累加计数:如果acc里已有该域名,就加1,否则从0开始加1 acc[domain] = (acc[domain] || 0) + 1; return acc; }, {}); } console.log(countDomains(emails)); // 输出:{ gmail.com: 1, hotmail.com: 2 }
关键逻辑说明
- filter阶段:这部分你写的是对的,成功过滤掉了不在指定
domains列表里的邮箱(比如host.com的两个邮箱会被筛掉) - reduce阶段:
- 先提取每个邮箱的域名,避免重复调用
split('@')[1] - 用
acc[domain] || 0处理初始值:如果该域名第一次出现,acc[domain]是undefined,此时取0,再加1就得到1;如果已经存在,就直接在原有数值上加1
- 先提取每个邮箱的域名,避免重复调用
内容的提问来源于stack exchange,提问作者Lex27
相关产品推荐
相关产品推荐

