# 数组去重的12种方法
在编程中,数组去重是一个常见且重要的操作,它可以帮助我们清理数据,确保数据的唯一性,本文将详细介绍数组去重的12种方法,涵盖从基础到高级的不同技术,适用于多种编程语言。
## 1. 双层循环去重
双层循环去重是最直观的方法之一,通过两层循环比较数组中的每个元素,如果发现重复则跳过,这种方法的时间复杂度为O(n^2),对于大数据集来说效率较低。
function unique(arr) { let res = []; for (let i = 0; i < arr.length; i++) { let flag = true; for (let j = 0; j < res.length; j++) { if (arr[i] === res[j]) { flag = false; break; } } if (flag) { res.push(arr[i]); } } return res; }
## 2. 利用`indexOf`方法去重
`indexOf`方法返回数组中某个元素的索引,如果不存在则返回-1,通过遍历数组,检查每个元素是否已存在于结果数组中,如果不存在则添加到结果数组中。
function unique(arr) { let res = []; for (let i = 0; i < arr.length; i++) { if (res.indexOf(arr[i]) === -1) { res.push(arr[i]); } } return res; }
## 3. 利用`filter`和`indexOf`结合去重
这种方法与第二种类似,但使用了`filter`方法,使代码更加简洁,`filter`方法创建一个新数组,其包含通过所提供函数实现的测试的所有元素。
function unique(arr) { return arr.filter((item, index) => arr.indexOf(item) === index); }
## 4. 排序后相邻元素去重
首先对数组进行排序,然后遍历排序后的数组,比较相邻元素是否相同,如果不同则添加到结果数组中,这种方法的时间复杂度主要由排序决定,通常为O(n log n)。
function unique(arr) { arr.sort(); let res = [arr[0]]; for (let i = 1; i < arr.length; i++) { if (arr[i] !== arr[i - 1]) { res.push(arr[i]); } } return res; }
## 5. 利用对象属性去重
JavaScript中对象的属性名是唯一的,可以利用这一特性进行去重,遍历数组,将数组元素作为对象的属性名,属性值可以设为任意值(如1),最后通过遍历对象的属性名来获取去重后的数组。
function unique(arr) { let obj = {}, res = []; for (let i = 0; i < arr.length; i++) { if (!obj[arr[i]]) { res.push(arr[i]); obj[arr[i]] = 1; } } return res; }
## 6. 利用`Set`去重
ES6中引入了`Set`数据结构,它类似于数组,但成员的值都是唯一的,利用`Set`的这一特性,可以非常方便地进行数组去重。
function unique(arr) { return [...new Set(arr)]; }
或者使用`Array.from`方法:
function unique(arr) { return Array.from(new Set(arr)); }
## 7. 利用`Map`去重
虽然`Map`主要用于键值对的存储,但也可以用来去重,通过遍历数组,将元素作为键存入`Map`,由于键是唯一的,因此可以达到去重的效果。
function unique(arr) { let map = new Map(); arr.forEach(item => map.set(item, true)); return [...map.keys()]; }
## 8. 递归去重
递归去重首先需要对数组进行排序,然后从最后一个元素开始向前遍历,如果发现重复元素则使用`splice`方法删除,这种方法在数组元素较多时可能会因为递归调用栈过深而导致性能问题。
```javascript
function unique(arr) {
arr.sort();
function loop