码迷,mamicode.com
首页 > 编程语言 > 详细

js数组去重

时间:2018-04-11 23:00:50      阅读:253      评论:0      收藏:0      [点我收藏+]

标签:认识自己   思路   时间   isa   fun   lse   新建   false   返回   

js数组去重也是老生常谈的话题了,怎么驱虫涅,最容易想到的就是直接新建一个数组,存放去重后的数组。由于NaN这种神奇的数字连他自己都不认识自己,所以目标数组如果需要去重NaN,需要用isNaN来判断一下,ok,码归正传,代码如下:

function unique01(arr){
    if(Array.isArray(arr)){
        var result = [];
        var flag = true;
        for(var i=0;i<arr.length;i++){
            if(result.indexOf(arr[i])===-1){
                if(isNaN(arr[i])&&flag){
                    result.push(arr[i]);
                    flag = false;
                }
                else if(isNaN(arr[i])){
                    continue;
                }
                else{
                    result.push(arr[i]);
                }
            }
        }
        return result;
    }
    else{
        return false;
    }
}

这种方法虽然实现上没太大难度,缺点确实很明显,一是不够快,时间复杂度O(n)2。二是费空间,需要新开一个数组来存放结果。

怎么才能不费空间呢,直接在原数组上操作,最后返回这个数组,嗯,思路有了,就看如何实现了,继续放码..

function unique02(arr){
    if(Array.isArray(arr)){
        var flag = true;
        for(var i=arr.length-1;i>0;i--){
            if(isNaN(arr[i])){
                flag = false;
            }
            for(var j=0;j<i;j++){
                if(isNaN(arr[j])&&(flag===false)){
                    arr.splice(i,1);
                }
                else if(arr[j]===arr[i]){
                    arr.splice(i,1);
                }
            }
        }
        return arr;
    }
    else{
        return false;
    }
}

仔细看看,这个操作还是有点水平的,虽然时间复杂度依然是O(n)2,起码空间不浪费了,当然,我们的目标不会止步于此的

function unique03(arr){
    if(Array.isArray(arr)){
        var result=[],obj={},val,type;
        for(var i=0;i<arr.length;i++){
            val = arr[i];
            type = typeof arr[i];
            if(!obj[val]){
                obj[val] = [type];
                result.push(val);
            }
            else if(obj[val].indexOf(type)==-1){
                obj[val].push(type);
                result.push(val);
            }
        }
        return result;
    }else{
        return false;
    }
}

是不是更6了,没错,这次我们把时间复杂度降到了O(n),不过有点遗憾的是空间浪费的有点多,用空间的代价换取时间。究竟值不值呢,你说了算。

当然,没有最6,只有更6,ES6中的代码其实这样写

function unique04(arr) {
    return Array.from(new Set(arr))
}

是的,你没有看错,只有一行,一行代码,搞定一切,就是这个feel。

 

js数组去重

标签:认识自己   思路   时间   isa   fun   lse   新建   false   返回   

原文地址:https://www.cnblogs.com/renbo/p/8799098.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!