在前端开发中,如果数组中的元素是对象,去重会稍微复杂一些,因为对象是引用类型,直接比较会导致去重失败。今天我们就来聊聊如何对 对象数组 进行去重,帮你彻底掌握这个技能!
对象数组去重的几种方法
1. 使用Set 和 JSON.stringify
通过 JSON.stringify 将对象转换为字符串,再利用 Set 去重。
示例代码:
const arr = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
{ id: 1, name: 'Alice' }, // 重复对象
{ id: 3, name: 'Charlie' }
];
const uniqueArr = [...new Set(arr.map(item => JSON.stringify(item))]
.map(item => JSON.parse(item));
console.log(uniqueArr);
// 输出:
// [
// { id: 1, name: 'Alice' },
// { id: 2, name: 'Bob' },
// { id: 3, name: 'Charlie' }
// ]
优点:代码简洁,适合简单对象。
缺点:对象属性顺序不同会导致去重失败。
2. 使用reduce 和find
通过 reduce 遍历数组,结合 find 判断是否已存在相同对象。
示例代码:
const arr = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
{ id: 1, name: 'Alice' }, // 重复对象
{ id: 3, name: 'Charlie' }
];
const uniqueArr = arr.reduce((acc, item) => {
if (!acc.find(i => i.id === item.id)) {
acc.push(item);
}
return acc;
}, []);
console.log(uniqueArr);
// 输出:
// [
// { id: 1, name: 'Alice' },
// { id: 2, name: 'Bob' },
// { id: 3, name: 'Charlie' }
// ]
优点:支持复杂对象,灵活性强。
缺点:性能较差,时间复杂度为 O(n²)。
3. 使用Map 和唯一键
利用 Map 的键名不可重复的特性,通过对象的唯一键(如 id)去重。
示例代码:
const arr = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
{ id: 1, name: 'Alice' }, // 重复对象
{ id: 3, name: 'Charlie' }
];
const map = new Map();
arr.forEach(item => {
if (!map.has(item.id)) {
map.set(item.id, item);
}
});
const uniqueArr = [...map.values()];
console.log(uniqueArr);
// 输出:
// [
// { id: 1, name: 'Alice' },
// { id: 2, name: 'Bob' },
// { id: 3, name: 'Charlie' }
// ]
优点:性能较好,时间复杂度为 O(n)。
缺点:需要指定唯一键(如 id)。
4. 使用lodash 库
lodash 是一个流行的 JavaScript 工具库,提供了 uniqBy 方法用于对象数组去重。
示例代码:
const _ = require('lodash');
const arr = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
{ id: 1, name: 'Alice' }, // 重复对象
{ id: 3, name: 'Charlie' }
];
const uniqueArr = _.uniqBy(arr, 'id');
console.log(uniqueArr);
// 输出:
// [
// { id: 1, name: 'Alice' },
// { id: 2, name: 'Bob' },
// { id: 3, name: 'Charlie' }
// ]
优点:代码简洁,功能强大。
缺点:需要引入第三方库。
总结
| 方法 | 优点 | 缺点 |
|---|---|---|
Set+ JSON.stringify | 代码简洁 | 对象属性顺序不同会导致去重失败 |
reduce+ =find | 支持复杂对象,灵活性强 | 性能较差 |
Map+ 唯一键 | 性能较好 | 需要指定唯一键(如 id) |
lodash | 代码简洁,功能强大 | 需要引入第三方库 |