JavaScript对象去重核心是将唯一性特征序列化为key,用Map缓存;推荐自定义key生成器(如u.id或${u.userId}-${u.orderId}-${u.status})并结合uniqueBy函数实现高效去重。

JavaScript 中通过键值对映射实现复杂对象去重,核心思路是:把对象的“唯一性特征”序列化为字符串作为 map 的 key,用 Map 或普通对象做哈希表缓存,从而在遍历时跳过重复项。
用 JSON.stringify 提取结构化唯一标识
适用于对象结构稳定、属性顺序一致、不含函数/undefined/Symbol/循环引用的场景。注意:属性顺序不同会导致字符串不同,建议先标准化键顺序。
- 先用
Object.keys(obj).sort()获取排序后的键名数组 - 再用
JSON.stringify序列化排序后的键值对,例如:JSON.stringify(Object.fromEntries(Object.entries(obj).sort())) - 对 Date、RegExp 等特殊类型需提前转为可序列化的格式(如
date.toISOString())
用自定义 key 生成器精准控制去重逻辑
更健壮的方式:不依赖全量序列化,只选取业务上真正决定“是否重复”的字段组合成 key。
- 例如用户对象按
id去重:obj.id - 订单对象按
userId + orderId + status拼接:${obj.userId}-${obj.orderId}-${obj.status} - 支持嵌套字段:
obj.profile?.email || obj.contact?.email
结合 Map 实现高效、可扩展的去重流程
Map 比普通对象更安全(避免原型污染),且支持任意类型 key,适合封装通用函数。
立即学习“Java免费学习笔记(深入)”;
- 定义去重函数:
function uniqueBy(arr, getKey) {<br> const seen = new Map();<br> return arr.filter(item => {<br> const key = getKey(item);<br> if (seen.has(key)) return false;<br> seen.set(key, true);<br> return true;<br> });<br>} - 调用示例:
uniqueBy(users, u => u.id);<br>uniqueBy(products, p => `${p.category}-${p.brand}`);
处理深层嵌套或动态结构的注意事项
当对象层级深、字段可能缺失或类型不固定时,需增强 key 生成的鲁棒性。
- 用
?.和空值默认值避免报错:obj.meta?.tags?.join(',') || '' - 对数组类字段,先排序再拼接,保证一致性:
[...new Set(arr)].sort().join('|') - 忽略无关字段(如时间戳、临时状态),只保留业务主键


















