数组去重
本文参考: JavaScript 高性能数组去重
看完后把代码敲了一编,代码如下:
//构造两个数组,后拼接在一起作为数据源
let arr1 = Array.from(new Array(1000000), (x, index) => {
return index;
});
let arr2 = Array.from(new Array(500000), (x, index) => {
return index + index;
});
let start = new Date().getTime();
console.log("开始去重...");
function distinct(a, b, fn) {
let preArr = a.concat(b);
return fn(preArr);
}
//以下是多种不同的去重方法,从上至下时间复杂度越来越低
function f_filter(arr) {
return arr.filter((e, index) => arr.indexOf(e) === index);
}
function f_forAndIndexOf(arr) {
let newArr = [];
for (let i = 0; i < arr.length; i++) {
if (newArr.indexOf(arr[i]) === -1) newArr.push(arr[i]);
}
return newArr;
}
function f_sortAndFor(arr) {
arr.sort();
let newArr = [arr[0]];
for (let i = 1; i < arr.length; i++) {
if (arr[i] !== arr[i - 1]) newArr.push(arr[i]);
}
return newArr;
}
function f_set(arr) {
return Array.from(new Set(arr));
}
function f_forOfAndObj(arr) {
let obj = {};
let newArr = [];
for (let i of arr) {
if (obj[i] !== 1) {
newArr.push(i);
obj[i] = 1;
}
}
return newArr;
}
//去重、打印耗时
console.log("去重后的长度:", distinct(arr1, arr2, f_set).length);
let end = new Date().getTime();
console.log("耗时:", end - start);从实践来看,几个去重函数从上至下,时间复杂度越来越低,对象的那个简直爆炸,时间贼短,比Set还快!这就是传说中的以空间换时间吧,set的表现也是相当惊人。
