js 对象数组去重
时间: 2025-05-15 11:52:29 浏览: 20
### JavaScript 对象数组去重方法
对于 JavaScript 中的对象数组去重,通常需要基于特定属性来判断重复项。以下是几种常见的对象数组去重方法:
#### 方法一:使用 `filter` 和 `findIndex`
通过 `filter` 配合 `findIndex` 实现去重,这种方法适用于根据某个唯一键(如 `id`)去除重复对象。
```javascript
const arr = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
{ id: 1, name: 'Charlie' }
];
const uniqueArr = arr.filter((item, index) =>
arr.findIndex(i => i.id === item.id) === index
);
console.log(uniqueArr);
// 输出: [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]
```
此方法的时间复杂度较高,因为每次调用 `findIndex` 都会重新遍历整个数组[^3]。
---
#### 方法二:使用 `reduce` 和 `includes`
利用 `reduce` 累积器存储已处理过的对象,并通过 `includes` 检查当前对象是否已经存在于累积结果中。
```javascript
const arr = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
{ id: 1, name: 'Charlie' }
];
const uniqueArr = arr.reduce((acc, item) => {
const isDuplicate = acc.some(obj => obj.id === item.id);
if (!isDuplicate) {
acc.push(item);
}
return acc;
}, []);
console.log(uniqueArr);
// 输出: [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]
```
该方法的优点是可以灵活扩展逻辑,缺点是当数组较大时性能可能较差,因为 `some` 的时间复杂度为 O(n)[^2]。
---
#### 方法三:使用 `Map` 或 `Object` 作为哈希表
这是最高效的一种方式,尤其适合大规模数据集。通过创建一个临时的 `Map` 或 `Object` 存储唯一的键值对,从而快速判断是否存在重复项。
##### 使用 `Map`
```javascript
const arr = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
{ id: 1, name: 'Charlie' }
];
const map = new Map();
const uniqueArr = arr.filter(item => !map.has(item.id) && map.set(item.id, true));
console.log(uniqueArr);
// 输出: [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]
```
##### 使用 `Object`
```javascript
const arr = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
{ id: 1, name: 'Charlie' }
];
const seen = {};
const uniqueArr = arr.filter(item => !(seen[item.id] = seen[item.id] ? true : false));
console.log(uniqueArr);
// 输出: [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]
```
这两种方法的核心思想都是构建一个高效的哈希结构用于记录已存在的键值[^4]。
---
#### 方法四:使用 `Set` 结合 JSON 字符串化
如果对象的内容完全一致,则可以通过将其转换为字符串并存入 `Set` 来实现去重。
```javascript
const arr = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
{ id: 1, name: 'Alice' }
];
const jsonSet = new Set(arr.map(JSON.stringify));
const uniqueArr = Array.from(jsonSet).map(JSON.parse);
console.log(uniqueArr);
// 输出: [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]
```
需要注意的是,这种方式仅适用于浅层比较的对象,且可能会因浮点数精度或其他因素导致意外行为。
---
### 性能对比总结
- **`filter` + `findIndex`**: 易于理解但效率较低。
- **`reduce` + `includes`/`some`**: 更加灵活但仍有优化空间。
- **`Map` / `Object` 哈希表**: 时间复杂度低,推荐用于大数据量场景。
- **`Set` + JSON 字符串化**: 方便快捷,但适用范围有限。
阅读全文
相关推荐

















