【数组去重的5种方法】在日常的编程过程中,数组去重是一个非常常见的需求。无论是前端开发还是后端处理,都需要对数据进行清洗和整理。本文将总结出五种常用的数组去重方法,并通过表格形式进行对比,帮助读者更好地理解和选择适合的方案。
一、方法概述
1. 使用 Set 数据结构
利用 Set 的自动去重特性,将数组转换为 Set,再转回数组。
2. 使用 filter + indexOf
遍历数组,利用 `indexOf` 判断当前元素是否已经出现过。
3. 使用 reduce + 对象存储
使用 `reduce` 方法遍历数组,通过对象记录已出现的元素。
4. 使用 includes + 循环
通过循环逐个判断当前元素是否已存在于新数组中。
5. 使用双重循环(暴力法)
通过两层循环比较每个元素,去除重复项。
二、方法对比表
方法名称 | 是否保留顺序 | 时间复杂度 | 空间复杂度 | 是否支持对象去重 | 是否兼容旧浏览器 |
使用 Set | 是 | O(n) | O(n) | 否 | 否(需 polyfill) |
filter + indexOf | 是 | O(n²) | O(n) | 否 | 是 |
reduce + 对象 | 是 | O(n) | O(n) | 是(需自定义) | 是 |
includes + 循环 | 是 | O(n²) | O(n) | 否 | 是 |
双重循环(暴力法) | 是 | O(n²) | O(n) | 否 | 是 |
三、方法详解
1. 使用 Set
```javascript
const arr = [1, 2, 2, 3, 4, 4];
const uniqueArr = [...new Set(arr)];
```
- 优点:简洁高效。
- 缺点:不支持对象去重,且在部分旧浏览器中可能需要 polyfill。
2. filter + indexOf
```javascript
const arr = [1, 2, 2, 3, 4, 4];
const uniqueArr = arr.filter((item, index) => arr.indexOf(item) === index);
```
- 优点:兼容性好。
- 缺点:时间复杂度较高,不适合大数据量。
3. reduce + 对象
```javascript
const arr = [1, 2, 2, 3, 4, 4];
const uniqueArr = arr.reduce((acc, item) => {
if (!acc.includes(item)) acc.push(item);
return acc;
}, []);
```
- 优点:可扩展性强,支持对象去重。
- 缺点:代码略显冗长。
4. includes + 循环
```javascript
const arr = [1, 2, 2, 3, 4, 4];
const uniqueArr = [];
for (let i = 0; i < arr.length; i++) {
if (!uniqueArr.includes(arr[i])) {
uniqueArr.push(arr[i]);
}
}
```
- 优点:逻辑清晰,容易理解。
- 缺点:效率较低,不推荐用于大规模数据。
5. 双重循环(暴力法)
```javascript
const arr = [1, 2, 2, 3, 4, 4];
const uniqueArr = [];
for (let i = 0; i < arr.length; i++) {
let isUnique = true;
for (let j = 0; j < uniqueArr.length; j++) {
if (arr[i] === uniqueArr[j]) {
isUnique = false;
break;
}
}
if (isUnique) uniqueArr.push(arr[i]);
}
```
- 优点:逻辑简单,适用于小数据集。
- 缺点:性能差,不推荐在大型项目中使用。
四、总结
数组去重是编程中的基础操作,不同方法适用于不同的场景。如果追求简洁高效,推荐使用 `Set`;如果需要兼容性或支持对象去重,可以使用 `reduce + 对象` 或 `filter + indexOf`。对于小规模数据,也可以使用简单的循环方式。根据实际需求选择合适的方法,才能更高效地完成任务。