面试时经常被问到数组去重的问题,个人觉得这种问题其实没太大的作用,毕竟在实际工作中很少能遇到的很大的数组,所以不论以什么样的方式实现都很难做到内存的溢出及产生较大的耗时差距(除非你是故意) 今天咱们对比一下那个速度更快
function createTestArray(){
const testArray=[1,2,3,4,5,'a','b','c','d','e'];
for(let i=0;i<13;i++){
testArray.push(...testArray);
}
testArray.sort((a,b)=>Math.random()>0.5?1:-1);
//console.log(`testArray:${testArray},length:${testArray.length}`);
return testArray;
}
const testArray=createTestArray();
function showTime(fun){
const start=new Date();
const result=fun();
return `name:${fun.name},time:${new Date()-start},result:${result.join(',')}`;
}
function removeRepeatBySet(){
return [...new Set(testArray)];
}
function removeRepeatByFilter(){
return testArray.filter((item,index,arr)=>arr.indexOf(item)==index);
}
function removeRepeatByForof(){
const obj={},arr=[],value={};
for(let i of testArray){
if(obj[i]==value){
continue;
}else if(obj[i]!=value){
obj[i]=value;
arr.push(i);
}
}
return arr;
}
function removeRepeatByFor(){
const obj={},arr=[],value={};
for(let i= 0,len=testArray.length;i
const item=testArray[i];
if(obj[item]==value){
continue;
}else if(obj[item]!=value){
obj[item]=value;
arr.push(item);
}
}
return arr;
}
const results=[];
for(var i=0;i<10;i++){
results.push(
showTime(removeRepeatBySet),
showTime(removeRepeatByForof),
showTime(removeRepeatByFilter),
showTime(removeRepeatByFor)
);
}
console.log(JSON.stringify(results.sort(),null,4));
打印的结果
[
"name:removeRepeatByFilter,time:10,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatByFilter,time:10,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatByFilter,time:12,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatByFilter,time:6,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatByFilter,time:7,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatByFilter,time:7,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatByFilter,time:8,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatByFilter,time:9,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatByFilter,time:9,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatByFilter,time:9,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatByFor,time:2,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatByFor,time:3,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatByFor,time:3,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatByFor,time:3,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatByFor,time:3,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatByFor,time:4,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatByFor,time:4,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatByFor,time:4,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatByFor,time:5,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatByFor,time:6,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatByForof,time:11,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatByForof,time:6,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatByForof,time:6,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatByForof,time:7,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatByForof,time:8,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatByForof,time:8,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatByForof,time:8,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatByForof,time:9,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatByForof,time:9,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatByForof,time:9,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatBySet,time:10,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatBySet,time:13,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatBySet,time:16,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatBySet,time:6,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatBySet,time:7,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatBySet,time:7,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatBySet,time:8,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatBySet,time:9,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatBySet,time:9,result:3,5,a,b,1,4,c,2,e,d",
"name:removeRepeatBySet,time:9,result:3,5,a,b,1,4,c,2,e,d"
]
此时我们可以看出。 for循环是用时最少的,其次for of,filter,而es6的Set用时最长