看了那么多博客,数组去重无非就 2 类:两层循环法 和 对象自身键不可重复。
let arr1 = Array.from(new Array(100000), (item, index) => {
return index;
});
let arr2 = Array.from(new Array(50000), (item, index) => {
return index + index;
});
let arr = arr1.concat(arr2);
以上面的arr
为例,分别进行测试:
一、两层循环法
- 两层
for
循环
for (let i = 0; i < arr.length; i++) {
for (let j = arr.length - 1; j > i; j--) {//倒数
if (arr[i] === arr[j]) {
arr.splice(j, 1);//splice 会改变数组的长度
}
}
}
for + indexOf
let result = []
for (var i = 0; i < arr.length; i++) {
if (result .indexOf(arr[i]) === -1) {
result .push(arr[i])
}
}
for + includes
let result = []
for (var i = 0; i < arr.length; i++) {
if (!result .includes(arr[i]) ) {
result .push(arr[i])
}
}
for
的变体如filter
、for...of
、forEach
、map
等和for
没差太多,此处不一一例举。
reduce
arr = arr.reduce((prev, cur) => (prev.includes(cur) ? prev : [...prev, cur]),[]);
二、对象自身键不可重复
for + Object
let result = []
let obj = {}
for (var i = 0; i < arr.length; i++) {
const arrValue = arr[i];
if (!obj[arrValue]) {
result.push(arrValue);
obj[i] = 1;
}
}
-
Set
:2 种写法,性能差不多
arr= [...new Set(arr)]
//或
arr= Array.from(new Set(arr));
总结
- 性能最优的是
for + Object
,其次是set
方法,推荐这两种。其他单层for
循环性能都差不多 -
reduce
性能最差,慎用。双重for
循环性能也较差,最好不用