实现数组去重的方法
# 实现数组去重的方法
# 功能描述
去除数组中的重复元素。
# 手写实现
# 思路一(ES5 时代常用)
注意:因为用到了 splice,所以该方法会改变原数组。
双层 for 循环:外层循环一次,内层从数组当前项的下一项开始循环。也就是外层从数组的第一项开始,分别在内层循环中,和数组的下一项开始逐一进行比较,如果出现重复元素就删掉。这种方法逻辑复杂且性能低,不推荐。
function distinct(arr) {
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i] === arr[j]) {
// arr 删除重复元素
arr.splice(j, 1);
// splice 会改变数组长度,所以每删除一个数 arr.length 就比原先少了 1,故 j 的值要减 1
j--;
}
}
}
return arr;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 思路二
注意:该方法会返回一个新的去重后的数组。
reduce 实现数组去重:利用高阶函数 reduce
进行去重,需要注意该函数的第二个参数 initialValue
得放一个空数组 []
,不然没法 push
。
function distinct(arr) {
return arr.reduce((acc, value) => {
if (!acc.includes(value)) {
acc.push(value);
}
return acc;
}, [])
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 思路三
注意:该方法会返回一个新的去重后的数组。
ES6 中的 Set
去重:例如 ES6 中新的数据结构 Set,它的一个特性就是成员值都是唯一的,没有重复的值。
function distinct(arr) {
return [...new Set(arr)];
}
1
2
3
2
3
# 测试用例
针对上述思路二和思路三,在 ES6 出现后思路一已不再推荐使用。
let arr = [1, 2, 2, 3, 3, 3, 4, 5, 5];
const result = distinct(arr);
console.log(result);
// [1, 2, 3, 4, 5]
1
2
3
4
5
2
3
4
5
(完)