Skip to content

数组去重

实现思路

数组去重是前端面试中的高频题目,主要有以下几种实现方式:

  • 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)));

各种方案对比

方案时间复杂度空间复杂度兼容性推荐场景
SetO(n)O(n)ES6+通用推荐
indexOfO(n²)O(n)通用教学理解
reduceO(n²)O(n)ES6+函数式编程
对象键值O(n)O(n)通用需处理非字符串

注意事项

  • new Set() 无法去除 {} 空对象(因为对象是引用类型)
  • 对象键值方式会自动将数字和字符串数字视为相同键
  • 对于 NaN,Set 可以正确去重,但对象键值方式不行