如何按指定邮箱域名优先级对字符串数组进行排序
按指定邮箱域名优先级排序的实现方法
核心思路是给每个优先级域名分配权重值,优先级越高权重值越小,排序时提取邮箱的域名匹配对应权重,按权重升序排列即可。
方法1:固定权重映射实现(适合优先级不变的场景)
直接预定义域名和权重的映射关系,逻辑简单运行效率高:
// 域名权重映射:数值越小优先级越高 const domainPriority = { 'gmail.com': 0, 'outlook.com': 1, 'yahoo.com': 2, 'hotmail.com': 3, 'live.com': 4, 'other': 5 } // 提取邮箱域名,自动处理大小写和无@的异常情况 const getDomain = (email) => { if (!email.includes('@')) return 'other' return email.split('@')[1].toLowerCase() } // 执行排序 const sortedEmails = personalEmail.sort((a, b) => { const weightA = domainPriority[getDomain(a)] ?? domainPriority.other const weightB = domainPriority[getDomain(b)] ?? domainPriority.other return weightA - weightB })
用示例数组测试,输出结果为:['email@gmail.com', 'email@outlook.com', 'email@yahoo.com', 'email@live.com', 'email@other.com'],完全符合要求的优先级顺序。
方法2:动态权重生成实现(适合优先级需调整的场景)
把优先级列表作为参数传入,动态生成权重映射,后续修改优先级只需要调整列表顺序即可,不需要修改核心逻辑:
// 优先级列表按从高到低排列,索引值即为对应权重 const priorityList = ['gmail.com', 'outlook.com', 'yahoo.com', 'hotmail.com', 'live.com'] const sortEmail = (emailList, priorityList) => { // 动态生成权重映射 const priorityMap = Object.fromEntries( priorityList.map((domain, idx) => [domain.toLowerCase(), idx]) ) const defaultWeight = priorityList.length // 复制原数组避免sort修改原数据 return [...emailList].sort((a, b) => { const domainA = a.includes('@') ? a.split('@')[1].toLowerCase() : '' const domainB = b.includes('@') ? b.split('@')[1].toLowerCase() : '' return (priorityMap[domainA] ?? defaultWeight) - (priorityMap[domainB] ?? defaultWeight) }) } // 调用示例 const sortedEmails = sortEmail(personalEmail, priorityList)
注意事项
- 所有域名统一转为小写匹配,避免
Gmail.COM这类大小写不一致的场景匹配失败 - 兼容了不含@的异常邮箱,统一归为其他域名排在最后
- 方法2使用扩展运算符复制原数组,避免
Array.sort的原地排序修改原数组数据
内容的提问来源于stack exchange,提问作者user16691768
相关产品推荐
相关产品推荐

