【数组去重的5种方法】在编程过程中,数组去重是一个常见且重要的操作。根据不同的语言和场景,可以采用多种方式实现数组元素的去重。以下是常见的五种数组去重方法,适用于JavaScript、Python等主流编程语言。
一、方法概述
| 方法名称 | 实现原理 | 是否保留顺序 | 时间复杂度 | 是否支持对象类型 |
| 使用 Set | 利用 Set 数据结构自动去重 | 是 | O(n) | 否(仅支持基本类型) |
| 双层循环 | 遍历数组,逐个比较 | 是 | O(n²) | 是(需自定义比较逻辑) |
| filter + indexOf | 利用 filter 和 indexOf 判断重复项 | 是 | O(n²) | 是(需自定义比较逻辑) |
| reduce | 通过 reduce 累加不重复元素 | 是 | O(n²) | 是(需自定义比较逻辑) |
| Map 或 Object | 利用键值对记录已出现元素 | 是 | O(n) | 是(需自定义比较逻辑) |
二、详细说明
1. 使用 Set
Set 是 JavaScript 中的一种数据结构,其特点是存储的值都是唯一的。利用 Set 的特性可以直接实现数组去重。
```javascript
const arr = [1, 2, 2, 3, 4, 4];
const uniqueArr = [...new Set(arr)];
```
优点:简洁高效,适合基本类型数组。
2. 双层循环
通过遍历数组,逐个检查当前元素是否已经存在于新数组中,若不存在则添加。
```javascript
function unique(arr) {
const result = [];
for (let i = 0; i < arr.length; i++) {
if (!result.includes(arr[i])) {
result.push(arr[i]);
}
}
return result;
}
```
优点:兼容性强,可处理对象类型。
3. filter + indexOf
使用 filter 方法结合 indexOf 来判断元素是否重复。
```javascript
const uniqueArr = arr.filter((item, index) => arr.indexOf(item) === index);
```
优点:代码简洁,逻辑清晰。
4. reduce
通过 reduce 累加器来收集不重复的元素。
```javascript
const uniqueArr = arr.reduce((acc, item) => {
if (!acc.includes(item)) acc.push(item);
return acc;
}, []);
```
优点:函数式风格,便于链式调用。
5. Map 或 Object
利用对象的键唯一性来记录已出现的元素。
```javascript
const uniqueArr = [];
const seen = {};
for (let i = 0; i < arr.length; i++) {
const key = JSON.stringify(arr[i]);
if (!seen[key]) {
seen[key] = true;
uniqueArr.push(arr[i]);
}
}
```
优点:支持对象类型的去重,灵活性高。
三、总结
数组去重是编程中的基础操作,选择合适的方法能提升代码效率与可读性。对于简单数据类型,推荐使用 `Set`;对于复杂数据类型或需要自定义比较逻辑的情况,建议使用双层循环、reduce 或 Map 方式。每种方法都有其适用场景,合理选择才能达到最佳效果。


