JavaScript中用Map去重的核心是利用键唯一性,以id等稳定字段为key存对象,自动覆盖重复项;可定制保留首个或最新记录,并在存入前完成标准化、空值处理等清洗动作。

用 JavaScript 的 Map 清洗后端脏数据时过滤重复记录,核心是利用其键的唯一性,把能标识“重复”的字段(如 id、phone、email)作为 Map 的 key,值存原始对象或所需字段。只要 key 相同,后续插入会自动覆盖——这本身就是一种轻量、可预测的去重机制。
选对去重依据:提取稳定唯一标识
后端返回的数据常有字段缺失、空值、类型混乱等问题,不能直接拿整个对象当 key(Map 不支持对象作 key 且无法自动深比较)。应优先选择业务上真正唯一、清洗后可稳定提取的字段:
- 若接口明确返回
id字段,且后端保证其全局唯一,就用item.id作为 key - 若
id缺失或为null/undefined,可降级用组合键,例如`${item.phone || ''}-${item.email || ''}` - 避免用易变字段(如
updatedAt、status)或含空格/大小写不一致的字段(如name),必要时先.trim().toLowerCase()
边遍历边存入 Map:天然覆盖重复项
遍历原始数组时,每次计算出 key,然后设进 Map。相同 key 的后续条目会自动替换前面的值,最终 Map.values() 就是去重后的干净数组:
const rawData = [
{ id: 1, name: "张三", phone: "13800138000" },
{ id: 2, name: "李四", phone: "13900139000" },
{ id: 1, name: "张三丰", phone: "13800138000" }, // 重复 id,但 name 脏
];
const uniqueMap = new Map();
rawData.forEach(item => {
// 做基础清洗:确保 id 存在且为字符串/数字
const key = item.id != null ? String(item.id) : null;
if (key) {
// 后续同 key 条目会自动覆盖,保留最后出现的(也可改为只保留首次)
uniqueMap.set(key, item);
}
});
const cleaned = Array.from(uniqueMap.values()); // [{ id: 1, name: "张三丰", ... }, { id: 2, ... }]
按需定制“保留首个”或“保留最新”逻辑
Map.set() 默认是覆盖,如果你希望保留第一次出现的记录(比如防止脏数据覆盖正确字段),只需加一层判断:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 保留首个:用
!uniqueMap.has(key)控制是否插入 - 保留最新(默认行为):直接
set即可 - 更复杂策略(如按时间选最新):可先清洗时间字段,再在
set前做比较
配合其他清洗动作一起做:不止于去重
实际清洗中,去重只是第一步。你可以在塞入 Map 前,顺手处理常见脏数据:
- 字段标准化:如
phone: item.phone?.replace(/[^0-9]/g, '') - 空值统一:如
name: item.name?.trim() || null - 类型修正:如
age: Number(item.age),并过滤isNaN的情况 - 无效项跳过:如
if (!key || !item.phone) return;
这样,一个 Map 实例就能同时完成去重 + 标准化 + 过滤,代码简洁,逻辑清晰,也便于后续扩展校验规则。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










