You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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 }

关键逻辑说明

  1. filter阶段:这部分你写的是对的,成功过滤掉了不在指定domains列表里的邮箱(比如host.com的两个邮箱会被筛掉)
  2. reduce阶段:
    • 先提取每个邮箱的域名,避免重复调用split('@')[1]
    • 用acc[domain] || 0处理初始值:如果该域名第一次出现,acc[domain]是undefined,此时取0,再加1就得到1;如果已经存在,就直接在原有数值上加1

内容的提问来源于stack exchange,提问作者Lex27

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:03:14