【js数组去重方法】在JavaScript开发中,数组去重是一个常见的需求。不同的场景下,我们可以采用多种方式实现数组元素的去重。以下是一些常用的去重方法,并对其优缺点进行了总结。
一、常见JS数组去重方法总结
方法名称 | 实现方式 | 是否保留顺序 | 是否支持对象类型 | 性能 | 适用场景 |
`Set` + `Array.from()` | `Array.from(new Set(arr))` | 是 | 否(仅支持基本类型) | 高 | 基本数据类型去重 |
`filter` + `indexOf` | `arr.filter((v, i) => arr.indexOf(v) === i)` | 是 | 否 | 低 | 简单去重,兼容性好 |
`reduce` + 对象存储 | `arr.reduce((acc, v) => { if (!acc.includes(v)) acc.push(v); return acc; }, [])` | 是 | 否 | 中等 | 自定义逻辑控制 |
`filter` + `includes` | `arr.filter((v, i) => arr.indexOf(v) === i)` | 是 | 否 | 低 | 简单直观 |
`Object.keys` + `Object.values` | `Object.values(Object.fromEntries(arr.map(v => [v, v])))` | 是 | 否 | 高 | 现代浏览器支持 |
`for循环` | 使用双重循环对比元素 | 是 | 否 | 低 | 学习用途或特定逻辑 |
二、方法详解
1. 使用 `Set`
- 优点:简洁高效,代码量少。
- 缺点:无法处理对象类型的去重,因为 `Set` 比较的是引用地址。
- 示例:
```javascript
const uniqueArr = Array.from(new Set([1, 2, 2, 3]));
```
2. 使用 `filter` + `indexOf`
- 优点:兼容性好,适合旧版本浏览器。
- 缺点:时间复杂度为 O(n²),性能较低。
- 示例:
```javascript
const uniqueArr = arr.filter((v, i) => arr.indexOf(v) === i);
```
3. 使用 `reduce` 和对象存储
- 优点:可以自定义逻辑,灵活度高。
- 缺点:代码略显复杂。
- 示例:
```javascript
const uniqueArr = arr.reduce((acc, v) => {
if (!acc.includes(v)) acc.push(v);
return acc;
}, []);
```
4. 使用 `for` 循环
- 优点:便于理解,适合教学。
- 缺点:代码冗长,效率低。
- 示例:
```javascript
let uniqueArr = [];
for (let i = 0; i < arr.length; i++) {
if (uniqueArr.indexOf(arr[i]) === -1) {
uniqueArr.push(arr[i]);
}
}
```
三、小结
- 如果你只需要对基本类型进行去重,推荐使用 `Set`,它是最简洁和高效的方案。
- 如果你需要保留顺序且需要兼容旧浏览器,可以选择 `filter` 或 `for` 循环。
- 对于对象类型的去重,需要结合 `JSON.stringify` 或自定义比较函数,这超出了本文的范围,但也是实际开发中需要注意的问题。
掌握这些方法后,你可以根据项目需求选择最合适的方式,提升代码的可读性和性能。