对象数组的去重方法

162 阅读2分钟

在前端开发中,如果数组中的元素是对象,去重会稍微复杂一些,因为对象是引用类型,直接比较会导致去重失败。今天我们就来聊聊如何对 对象数组 进行去重,帮你彻底掌握这个技能!


对象数组去重的几种方法

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代码简洁,功能强大需要引入第三方库