Skip to content

数组去重问题

数组去重是 JavaScript 面试中的常见问题。本文将介绍多种去重方法及其优缺点。

1. 使用 Set

Set 是 ES6 引入的新数据结构,它只存储唯一值。

javascript
const array = [1, 2, 3, 3, 4, 5, 5];
const uniqueArray = [...new Set(array)];
console.log(uniqueArray); // [1, 2, 3, 4, 5]

优点

  • 代码简洁
  • 时间复杂度为 O(n)

缺点

  • 无法处理对象类型的元素

2. 使用 filter 和 indexOf

通过检查元素第一次出现的位置来判断是否重复。

javascript
const array = [1, 2, 3, 3, 4, 5, 5];
const uniqueArray = array.filter(
  (item, index) => array.indexOf(item) === index
);
console.log(uniqueArray); // [1, 2, 3, 4, 5]

优点

  • 兼容性好

缺点

  • 时间复杂度为 O(n^2)

3. 使用 reduce

使用 reduce 方法构建新数组,检查元素是否已存在。

javascript
const array = [1, 2, 3, 3, 4, 5, 5];
const uniqueArray = array.reduce((acc, curr) => {
  if (!acc.includes(curr)) {
    acc.push(curr);
  }
  return acc;
}, []);
console.log(uniqueArray); // [1, 2, 3, 4, 5]

优点

  • 可读性好

缺点

  • 时间复杂度为 O(n^2)

4. 使用对象属性

利用对象属性不能重复的特性。

javascript
const array = [1, 2, 3, 3, 4, 5, 5];
const obj = {};
array.forEach((item) => (obj[item] = true));
const uniqueArray = Object.keys(obj).map(Number);
console.log(uniqueArray); // [1, 2, 3, 4, 5]

优点

  • 时间复杂度为 O(n)

缺点

  • 只能处理字符串和数字类型的元素

5. 使用 Map

Map 是 ES6 引入的新数据结构,可以存储任意类型的键。

javascript
const array = [1, 2, 3, 3, 4, 5, 5];
const map = new Map();
array.forEach((item) => map.set(item, true));
const uniqueArray = [...map.keys()];
console.log(uniqueArray); // [1, 2, 3, 4, 5]

优点

  • 可以处理任意类型的元素
  • 时间复杂度为 O(n)

缺点

  • 代码稍显复杂

总结

方法时间复杂度优点缺点
SetO(n)代码简洁无法处理对象
filter + indexOfO(n^2)兼容性好性能差
reduceO(n^2)可读性好性能差
对象属性O(n)性能好只能处理字符串和数字
MapO(n)支持任意类型代码稍复杂

在实际开发中,应根据具体需求选择合适的方法。如果需要处理任意类型的元素且性能要求高,推荐使用 Map;如果只需要处理基本类型且代码简洁优先,推荐使用 Set。

基于 MIT 许可发布