今天看到一篇文章,哇,超赞的,测试一下数组去重的性能.
测试模板
// distinct.js
let arr1 = Array.from(new Array(100000), (x, index)=>{
return index
});
let arr2 = Array.from(new Array(50000), (x, index)=>{
return index+index
});
let arr3 = arr1.concat(arr2);
let start = new Date().getTime();
console.log('开始数组去重');
function distinct(array) {
// 数组去重
var newArr = []; //一个新的临时数组
for(var i = 0; i < array.length; i++){
if(newArr.indexOf(array[i]) === -1){
newArr.push(array[i]);
}
}
return newArr;
}
console.log('去重后的长度', distinct(arr3).length);
let end = new Date().getTime();
console.log('耗时', end - start)
然后就把自己知道的一些去重方法丢进去,就知道自己平时使用的数组去重的方法性能到底如何了.
先试试最常见的利用一层for循环遍历加indexOf
// 数组去重
var newArr = []; //一个新的临时数组
for(var i = 0; i < array.length; i++){
if(newArr.indexOf(array[i]) === -1){
newArr.push(array[i]);
}
}
return newArr;
image.png
明显卡成狗了,一共才150000个数据
再来试试es6最简便的方法
Array.from(new Set(array))
image.png
这快的有点夸张了
解构赋值结合再试试
[...new Set(array)]
image.png
又快了一点。
试一下先排序再去重
array.sort();
const newArr = [array[0]];
for (let i = 1; i < array.length; i++) {
if (array[i] !== newArr[newArr.length - 1]) {
newArr.push(array[i]);
}
}
return newArr;
image.png
也还可以
利用对象属性唯一实现数组去重,这个是我之前想到的一个方法
const obj = {}, newArr = [];
for (let i = 0; i < array.length; i++) {
if(!obj[array[i]]){
obj[array[i]] = 1;
newArr.push(array[i]);
}
}
return newArr
image.png
结果让我非常惊讶,速度飞快,但是比较有局限性,之前想到这个办法就是觉得利用对象的键值对去代替indexOf或者循环会更加快,今天试了下,果然如此.但是后来发现这个方法有一定的局限性,因为object的属性会把所有类型的变量都转化为string类型的,也就是1和'1'是会被替换掉的,类似这些都会出现问题.
文章参考自 # JavaScript 高性能数组去重
网友评论