JavaScript数组去重

本文最后更新于 2025年7月30日 下午

参考:https://juejin.cn/post/6844903602197102605

Set 与扩展操作符去重

ES6 新增数据类型 Set,Set 一个最大的特点就是数据不重复。Set() 构造函数可以接受一个数组(或类数组)作为参数来初始化,利用该特性和扩展操作符能够做到给数组去重。

1
2
3
function unique(arr) {
return [...new Set(arr)];
}

Set 与 Array.from()方法去重

原理同上,不过使用的是Array.from()方法,该方法可以将可迭代对象转换为数组。

1
2
3
function unique(arr) {
return Array.from(new Set(arr));
}

indexOf()方法去重 1

indexOf()方法可返回某个指定的元素在数组中首次出现的位置。先定义一个空数组 res,然后调用indexOf()方法对原来的数组进行遍历判断,如果元素不在 res 中,则将其放进 res 中,最后将 res 返回即可获得去重后的数组。

1
2
3
4
5
6
7
function unique(arr) {
const res = [];
arr.forEach((ele) => {
if (res.indexOf(ele) === -1) res.push(ele);
});
return res;
}

indexOf()方法去重 2

利用indexOf()方法检测元素在数组中第一次出现的位置是否和元素现在的位置相等,如果不等则说明该元素是重复元素。filter方法返回就是数组,不用定义空数组。

1
2
3
function unique(arr) {
return arr.filter((ele, index) => arr.indexOf(ele) === index);
}

相邻元素去重

首先用数组的排序方法sort(),然后根据排序后的结果进行遍历及相邻元素比对,如果相等则跳过改元素,直到遍历结束。

1
2
3
4
function unique(arr) {
arr = arr.sort();
return arr.filter((ele, index) => ele !== arr[index + 1]);
}

利用对象去重

创建一个空对象和一个空数组,之后遍历原数组,将原数组中的值设为对象的属性,并给该属性赋初始值 1,每出现一次,对应的属性值增加 1,这样,对应的属性值就是该元素出现的次数。(可以去掉 else 部分)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function unique(arr) {
const res = [],
obj = {};
arr.forEach((ele) => {
if (!obj[ele]) {
res.push(ele);
obj[ele] = 1;
} else {
// 可以去掉 else 部分
obj[ele]++;
}
});
return res;
}

用 Map:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function unique(arr) {
const res = [],
map = new Map();
arr.forEach((ele) => {
if (!map.has(ele)) {
res.push(ele);
map.set(ele, 1);
} else {
// 可以去掉 else 部分
map.set(ele, map.get(ele) + 1);
}
});
return res;
}

用 Set:

1
2
3
4
5
6
7
8
9
10
11
function unique(arr) {
const res = [],
set = new Set();
arr.forEach((ele) => {
if (!set.has(ele)) {
set.add(ele);
res.push(ele);
}
});
return res;
}

双循环去重

双重 for 循环是比较笨拙的方法,原理很简单:先定义一个包含原始数组第一个元素的数组,然后遍历原始数组,将原始数组中的每个元素与新数组中的每个元素进行比对,如果不重复则添加到新数组中,最后返回新数组。因为它的时间复杂度是 O(n^2),如果数组长度很大,那么将会非常耗费内存。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function unique(arr) {
const res = [arr[0]];
for (let i = 1; 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;
}

JavaScript数组去重
https://xuekeven.github.io/2021/09/23/JavaScript数组去重/
作者
Keven
发布于
2021年9月23日
更新于
2025年7月30日
许可协议