数组去重

面试时经常被问到数组去重的问题,个人觉得这种问题其实没太大的作用,毕竟在实际工作中很少能遇到的很大的数组,所以不论以什么样的方式实现都很难做到内存的溢出及产生较大的耗时差距(除非你是故意),这里以2的13次方乘以10个数组项为例,在不改变原数组的前提下,做了几种没考虑效率及内存的方法,仅以实现为目的

        {
            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


执行10次的执行结果


[
    "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用时最长

阅读更多
个人分类: 面试
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭