JavaScript数组去重需标准化对象:先按key字母序排序并重建对象,再JSON.stringify生成稳定键,结合Set或Map实现去重;扁平对象适用,嵌套结构需深比较或定制序列化,注意null、Symbol等边界情况。

JavaScript 数组去重时忽略对象属性顺序,本质是判断两个对象是否“键值对相同但顺序不同”。原生没有直接支持,需将对象标准化(如按 key 排序后转为字符串)再比对。
用 JSON.stringify + 排序后的键来标准化对象
把每个对象的属性按 key 字母序排序,再序列化,确保结构相同但顺序不同的对象生成相同的字符串。
- 先用
Object.keys(obj).sort()获取排序后的键数组 - 用
reduce按序提取键值,构建新对象(或直接拼字符串) - 再用
JSON.stringify得到稳定标识符 - 最后结合
filter或Set去重
示例:
const arr = [
{ name: 'Alice', age: 25 },
{ age: 25, name: 'Alice' }, // 属性顺序不同
{ name: 'Bob', age: 30 }
];
const seen = new Set();
const unique = arr.filter(obj => {
const sortedKeys = Object.keys(obj).sort();
const sortedObj = sortedKeys.reduce((acc, key) => {
acc[key] = obj[key];
return acc;
}, {});
const key = JSON.stringify(sortedObj);
if (seen.has(key)) return false;
seen.add(key);
return true;
});
// unique === [{ name: 'Alice', age: 25 }, { name: 'Bob', age: 30 }]
处理嵌套对象和数组(进阶需求)
上面方法只适用于扁平对象。若含嵌套对象、数组或特殊值(undefined、function、Date),JSON.stringify 会丢失或出错。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 可改用
fast-deep-equal或lodash.isEqual配合双层循环去重 - 或用
structuredClone(现代环境)+ 自定义比较函数 - 简单场景下,先深克隆再排序键,再 stringify,能覆盖多数嵌套情况
用 Map 存储标准化键,提升大数组性能
当数组很大时,反复调用 filter + includes 效率低。用 Map 缓存已见的标准化键更高效。
- 每轮生成标准化 key 后查 Map,O(1) 判断是否重复
- 避免每次都在结果数组中线性查找
- 适合处理几百个以上对象的数组
注意边界情况
实际使用时要留意这些细节:
-
null 和 undefined:需提前过滤或统一转为
null再处理 - Symbol / BigInt / Date / RegExp:JSON.stringify 会忽略 Symbol、转 Date 为字符串、丢弃 RegExp,需单独序列化逻辑
-
原型链属性:
Object.keys只取自身可枚举属性,符合常规预期;若需含继承属性,改用Reflect.ownKeys+ 过滤不可枚举项

















