数组去重
实现思路
数组去重是前端面试中的高频题目,主要有以下几种实现方式:
- Set:利用 Set 的去重特性,最简洁
- indexOf:遍历数组,利用 indexOf 判断是否已存在
- reduce:利用 reduce 累积器
- 对象键值:利用对象键名的唯一性
代码实现
Set 方式(推荐)
js
[...new Set(arr)];indexOf 方式
js
arr.filter((item, index) => arr.indexOf(item) === index);reduce 方式
js
arr.reduce((prev, cur) => {
return prev.includes(cur) ? prev : [...prev, cur];
}, []);对象键值方式
js
var obj = {};
arr.filter((item) => (obj.hasOwnProperty(item) ? false : (obj[item] = true)));各种方案对比
| 方案 | 时间复杂度 | 空间复杂度 | 兼容性 | 推荐场景 |
|---|---|---|---|---|
| Set | O(n) | O(n) | ES6+ | 通用推荐 |
| indexOf | O(n²) | O(n) | 通用 | 教学理解 |
| reduce | O(n²) | O(n) | ES6+ | 函数式编程 |
| 对象键值 | O(n) | O(n) | 通用 | 需处理非字符串 |
注意事项
new Set()无法去除{}空对象(因为对象是引用类型)- 对象键值方式会自动将数字和字符串数字视为相同键
- 对于
NaN,Set 可以正确去重,但对象键值方式不行