数组去重的七种方法
1. 利用 ES6 的 Set 结构
-
原理:Set 数据结构的特点是成员值唯一,即不会有重复的值,所以可以利用这一特性来快速实现数组去重。
-
示例代码(JavaScript) :
收起
javascript
复制
const arr = [1, 2, 2, 3, 3, 4];
const uniqueArr = [...new Set(arr)];
console.log(uniqueArr);
// [1, 2, 3, 4]
2. 双层 for 循环(暴力去重法)
-
原理:通过外层循环遍历数组,内层循环对比当前元素与后面元素是否相同,若相同则删除内层循环对应的重复元素。
-
示例代码(JavaScript) :
收起
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;
}
const arr = [1, 2, 2, 3, 3, 4];
const uniqueArr = unique(arr);
console.log(uniqueArr);
// [1, 2, 3, 4]
不过这种方法在处理大型数组时性能较差,因为涉及大量的循环比较以及数组元素的删除操作,会有较高的时间复杂度。
3. 利用 indexOf () 方法
-
原理:通过遍历数组,对于每个元素,检查它在新数组中的
indexOf值是否等于当前索引,如果相等说明是首次出现该元素,将其添加到新数组中,否则就是重复元素,不予添加。 -
示例代码(JavaScript) :
收起
javascript
复制
function unique(arr) {
const result = [];
for (let i = 0; i < arr.length; i++) {
if (result.indexOf(arr[i]) === -1) {
result.push(arr[i]);
}
}
return result;
}
const arr = [1, 2, 2, 3, 3, 4];
const uniqueArr = unique(arr);
console.log(uniqueArr);
// [1, 2, 3, 4]
4. 利用 includes () 方法
-
原理:类似
indexOf方法的思路,只不过是用includes来判断新数组是否已经包含当前元素,若不包含则添加进去,从而实现去重。 -
示例代码(JavaScript) :
收起
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;
}
const arr = [1, 2, 2, 3, 3, 4];
const uniqueArr = unique(arr);
console.log(uniqueArr);
// [1, 2, 3, 4]
5. 利用对象的属性唯一性(键值对形式)
-
原理:把数组元素作为对象的属性名,由于对象的属性名是唯一的,所以可以利用这个特性来进行去重。当遍历数组时,每次将元素作为属性名添加到对象中,最后提取对象的属性名转换回数组即可。
-
示例代码(JavaScript) :
收起
javascript
复制
function unique(arr) {
const obj = {};
const result = [];
for (const element of arr) {
if (!obj[element]) {
obj[element] = true;
result.push(element);
}
}
return result;
}
const arr = [1, 2, 2, 3, 3, 4];
const uniqueArr = unique(arr);
console.log(uniqueArr);
// [1, 2, 3, 4]
6. 利用 Map 数据结构
-
原理:Map 数据结构保存键值对,并且键是唯一的,与利用对象去重的思路类似,把数组元素作为 Map 的键,通过遍历数组将元素存入 Map 中,最后获取 Map 的键来构成去重后的数组。
-
示例代码(JavaScript) :
收起
javascript
复制
function unique(arr) {
const map = new Map();
const result = [];
for (const element of arr) {
if (!map.has(element)) {
map.set(element, true);
result.push(element);
}
}
return result;
}
const arr = [1, 2, 2, 3, 3, 4];
const uniqueArr = unique(arr);
console.log(uniqueArr);
// [1, 2, 3, 4]
7. 利用排序后相邻元素对比法
-
原理:先对数组进行排序,这样重复的元素就会相邻,然后遍历排序后的数组,对比相邻元素是否相同,若不同则将元素添加到新数组中,以此实现去重。
-
示例代码(JavaScript) :
收起
javascript
复制
function unique(arr) {
arr.sort((a, b) => a - b);
const result = [arr[0]];
for (let i = 1; i < arr.length; i++) {
if (arr[i]!== arr[i - 1]) {
result.push(arr[i]);
}
}
return result;
}
const arr = [1, 2, 2, 3, 3, 4];
const uniqueArr = unique(arr);
console.log(uniqueArr);
// [1, 2, 3, 4]