数组去重
时间: 2025-07-01 20:55:20 浏览: 5
### 3.1 使用 `Set` 数据结构进行去重
在现代 JavaScript 中,使用 `Set` 是最简洁高效的数组去重方式。`Set` 是一种集合结构,能够自动去除重复值[^1]。
```javascript
function unique(arr) {
return [...new Set(arr)];
}
```
这种方法适用于大多数基本类型(如数字、字符串、布尔值),但无法正确处理对象引用不同的情况,例如 `{}` 和 `{}` 被视为两个不同的元素[^2]。
---
### 3.2 利用双重 `for` 循环和 `splice` 去重
这是一种兼容性较好的方法,适用于不支持 `Set` 的旧浏览器环境。通过遍历数组并比较每个元素,若发现重复则使用 `splice` 删除后一个重复项。
```javascript
function unique(arr) {
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i] === arr[j]) {
arr.splice(j, 1);
j--;
}
}
}
return arr;
}
```
此方法会修改原数组,并且对 `NaN` 和对象的去重效果不佳[^2]。
---
### 3.3 使用递归结合去重逻辑
如果数组中包含嵌套数组,可以结合递归实现深度扁平化与去重操作。以下是一个基于递归和 `filter` 实现的方法:
```javascript
function flattenAndUnique(arr) {
const flattened = arr.reduce((result, item) => {
return result.concat(Array.isArray(item) ? flattenAndUnique(item) : item);
}, []);
return flattened.filter((item, index, array) => array.indexOf(item) === index);
}
```
该方法先将嵌套数组展开为一维数组,再利用 `filter` 和 `indexOf` 实现去重[^1]。
---
### 3.4 使用栈结构模拟递归进行非递归去重
为了避免递归带来的栈溢出问题,可以使用栈结构模拟递归过程,并结合 `Set` 实现去重:
```javascript
function flattenAndUnique(arr) {
const stack = [...arr];
const result = [];
const seen = new Set();
while (stack.length) {
const item = stack.pop();
if (Array.isArray(item)) {
stack.push(...item);
} else if (!seen.has(item)) {
seen.add(item);
result.unshift(item);
}
}
return result;
}
```
这种方式避免了深层递归导致的调用栈溢出问题,同时保证去重效果[^3]。
---
### 3.5 使用字符串转换法进行扁平化与去重
对于简单的数据结构,可以通过将数组转换为字符串,去除方括号后再解析为数组,并结合 `Set` 去重:
```javascript
function unique(arr) {
const str = JSON.stringify(arr).replace(/$|$/g, '').split(',');
return [...new Set(str.map(JSON.parse))];
}
```
此方法简单易行,但对复杂对象或函数等不可序列化的数据无效[^2]。
---
### 3.6 利用 `filter` 和 `indexOf` 实现去重
这是一种较为传统的去重方法,适用于已经扁平化的数组:
```javascript
function unique(arr) {
return arr.filter((item, index, array) => array.indexOf(item) === index);
}
```
虽然代码简洁,但其时间复杂度为 O(n²),在处理大规模数据时性能较差[^1]。
---
### 3.7 性能对比与适用场景
- **`Set` 方法**:适用于现代浏览器,代码简洁高效,推荐使用。
- **双层 `for` 循环 + `splice`**:适用于需要兼容 ES5 的环境。
- **递归 + `filter`**:适用于嵌套数组的扁平化与去重。
- **栈结构模拟递归**:适用于防止栈溢出的大规模嵌套数组。
- **字符串转换法**:适用于简单结构,不适合包含对象或函数的数组。
---
###
阅读全文
相关推荐















