答案:按属性去重可用map或reduce,多属性组合可拼接键值,深度去重可用jsON.stringify或lodash的isEqual,推荐根据数据结构选择方法。

在 javaScript 中,处理嵌套数组对象去重时,关键在于如何定义“重复”。通常我们认为两个对象的某个或某些属性值相同即为重复。下面以常见场景为例,介绍几种实用的去重方法。
1. 按单一属性去重
如果对象中有一个唯一标识字段(如 id),可以通过该字段进行去重。
使用 Map 或 reduce 方法按指定属性过滤重复项:
示例数据:
const arr = [
{ id: 1, name: ‘Alice’ },
{ id: 2, name: ‘Bob’ },
{ id: 1, name: ‘Alice’ }
];
方法一:使用 Map
const uniqueById = Array.from(
new Map(arr.map(item => [item.id, item])).values()
);
方法二:使用 reduce
const uniqueById = arr.reduce((acc, curr) => {
if (!acc.some(item => item.id === curr.id)) {
acc.push(curr);
}
return acc;
}, []);
2. 按多个属性组合去重
当需要根据多个字段(如 id 和 name)共同判断是否重复时,可以将这些字段拼接成字符串作为唯一键。
示例: 根据 id 和 name 去重
const uniqueByKeys = Array.from(
new Map(
arr.map(item => [`${item.id}-${item.name}`, item])
).values()
);
这种方法适用于固定字段的精确匹配。
3. 深度去重(处理任意嵌套结构)
若对象结构复杂且需深度比较内容,可借助 json.stringify 配合 Set 实现,但注意顺序和类型必须一致。
简单实现:
const deepUnique = Array.from(
new Set(arr.map(JSON.stringify)),
JSON.parse
);
注意: 此方法对属性顺序敏感。例如 {a:1,b:2} 和 {b:2,a:1} 被视为不同对象。
如需真正深度比较,建议引入 lodash 的 isEqual,或自行实现递归对比函数。
4. 使用 lodash 简化操作
如果你项目中使用了 lodash,可以直接用 _.uniqBy 方法。
import { uniqBy } from ‘lodash’;
const result = uniqBy(arr, ‘id’);
// 多字段支持:uniqBy(arr, o => [o.id, o.name].join(‘-‘))
基本上就这些常用方式。选择哪种取决于你的数据结构和性能要求。对于小数据量,JSON.stringify 方便快捷;对于大数组或复杂逻辑,推荐使用 Map + 键映射的方式,效率更高。