Lodash的uniq仅支持基于===的浅层去重,适用于基础类型;高效灵活去重需用uniqBy或原生Map/Set实现。

Lodash 的 uniq 函数本身不支持“高效去重”的自定义逻辑,它只对数组元素做浅层相等(===)判断,适用于基础类型或引用一致的场景。真正高效、灵活的去重需结合 uniqBy 或手动配合 Map/Set 实现。
直接用 uniq:仅适合简单数组
它内部用 Set 缓存已见值,时间复杂度接近 O(n),但限制明显:
- 只能处理一维数组,且依赖
===比较(对象/函数永远不等) - 对数字
0和-0、NaN等边界值按SameValueZero规则处理(这是合理的设计,不是 bug)
示例:
```jsimport { uniq } from 'lodash';
uniq([1, 2, 2, 3, 1]); // → [1, 2, 3]
uniq(['a', 'b', 'a']); // → ['a', 'b']
uniq([NaN, NaN, 1]); // → [NaN, 1](正确去重 NaN)
```
用 uniqBy 处理对象或复杂规则
这才是实际项目中“高效去重”的主力函数。它允许你指定提取唯一标识的字段或计算方式,底层仍保持 O(n) 时间复杂度:
- 传字符串(如
'id')自动取属性值 - 传函数(如
item => item.name.toLowerCase())可做归一化处理 - 避免手写
filter + findIndex,性能更稳、代码更短
示例:
```jsimport { uniqBy } from 'lodash';
const users = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
{ id: 1, name: 'alice' } // id 重复
];
uniqBy(users, 'id'); // → [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]
uniqBy(users, user => user.name.toLowerCase()); // → 基于姓名忽略大小写去重
```
比 Lodash 更轻更快的原生替代方案
如果只针对简单去重,现代 JS 的 Set + 扩展运算符足够快且无依赖:
-
[...new Set(arr)]:基础类型最快,语义清晰 - 对象数组去重建议用
Map手写一次遍历(比多次find高效):
// 按 id 去重对象数组(O(n))
const uniqueById = (arr) => {
const seen = new Map();
return arr.filter(item => {
if (seen.has(item.id)) return false;
seen.set(item.id, true);
return true;
});
};
```
注意避坑:别在大数据量时滥用 uniqBy 的函数参数
如果传入的迭代器函数本身很重(如深克隆、正则匹配、大量字符串操作),它会被调用 n 次,反而拖慢整体速度:
- 优先用字段字符串形式(
uniqBy(arr, 'prop')) - 若必须用函数,提前计算好键值并缓存(比如先
map出 key 数组再uniq) - 超 10 万条数据时,考虑分块或 Web Worker,Lodash 不解决架构问题


















