json.stringify去重仅适用于结构简单、无函数/undefined/特殊对象/循环引用的纯对象数组,本质是序列化后用set去重再解析,适合临时脚本;遇特殊类型、属性顺序不一、需保留undefined或大数据量时应改用map等正经方案。

用 JSON.stringify 去重,本质是把数组元素先转成字符串再 dedupe,适合「结构简单、无函数/undefined/symbol/循环引用」的对象数组,属于快速验证或临时脚本里的取巧写法,不能当通用方案。
适用场景:纯对象数组(无嵌套函数、无 undefined)
比如你有一组配置项、API 返回的扁平数据,字段固定且都是基础类型:
-
[{id: 1, name: "a"}, {id: 2, name: "b"}, {id: 1, name: "a"}]→ 可以去重 - 但
[{id: 1, fn: () => {}}]或[{id: 1, time: new Date()}]就会出问题(函数变undefined,Date 变字符串,丢失原始语义)
一行偷懒写法(附说明)
核心逻辑:先 map 成字符串,用 Set 去重,再 map 回对象:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const unique = arr => [...new Set(arr.map(JSON.stringify))].map(JSON.parse);
- ✅ 简洁、可读性尚可,适合调试或内部工具
- ⚠️ 注意:如果原数组含
null、NaN、undefined,JSON.stringify会统一处理(如undefined被忽略),可能误伤 - ⚠️ 性能一般:每个元素都经历两次序列化/反序列化,大数据量时明显慢于 Map 或 for 循环
比它更稳一点的“半偷懒”替代
想少写逻辑又不想踩坑?可以用 Map + 自定义 key(比如只基于 id 字段):
const uniqueById = arr => {
const seen = new Map();
return arr.filter(item => {
if (seen.has(item.id)) return false;
seen.set(item.id, true);
return true;
});
};
- 不依赖 JSON,稳定可控
- 只比纯字符串方案多写几行,但逻辑清晰、可扩展(比如支持多字段联合去重)
- 遇到重复 id,保留第一个,符合常见预期
什么情况下坚决别用 stringify?
以下任意一条命中,就该换正经方法(如自定义比较、Map 缓存、Lodash 的 uniqBy):
- 对象里有
Date、RegExp、Map、Set等特殊类型 - 属性顺序不固定(
{a:1,b:2}和{b:2,a:1}stringify 后不同,但语义相同) - 需要保留
undefined或区分null与"null" - 数组很大(>10000 项),对性能敏感
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










