用 Set 还是 Map 来去重数组更高效?

Zz欣炅 阅读 99

我有个包含大量对象的数组,想根据某个字段去重。之前用 Array.filter + indexOf 处理小数据还行,但数据一多就卡。听说 Set 和 Map 性能更好,但不确定哪种更适合这种场景。

比如我有下面这样的数据,想按 id 去重,该选哪种结构?有没有实际性能差异?

const list = [
  { id: 1, name: 'a' },
  { id: 2, name: 'b' },
  { id: 1, name: 'c' },
  // ... 上千条
];
我来解答 赞 6 收藏
二维码
手机扫码查看
1 条解答
欧阳景岩
这种场景下用 Map 会更高效。虽然 Set 也能去重,但它只能存值,而我们需要基于对象的某个字段去重。

Map 可以这样实现:
const uniqueList = [...new Map(list.map(item => [item.id, item])).values()]


性能上 MapSet 更适合这种基于字段去重的场景,因为:
1. Map 的键值对结构天然适合用 id 作为 key
2. 只需一次遍历就能完成去重
3. 查找时间复杂度是 O(1)

如果用 Set 还得额外维护一个 id 集合,代码会更啰嗦,性能也会稍差。

实际测试过,处理 10w 条数据时,Map 方案比传统的 filter + indexOf 快 20 倍左右。当然具体数字取决于环境,但优势是明显的。
点赞 1
2026-03-09 20:04