• js数组去重


    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。

  • 相关阅读:
    百度地图API显示多个标注点带百度样式信息检索窗口的代码
    百度地图API显示多个标注点并添加百度样式检索窗口
    百度地图API显示多个标注点并添加百度样式检索窗口
    生了一场闷气
    追求效率还是追求真理
    在VC++应用程序中读取文本数据
    一种创建子视图窗口的办法
    学会从已知推出未知
    unresolved external symbol __beginthreadex错误的解决——谈谈在Win32 Consle Application如何使用MFC类
    为何能在视图类能更新界面
  • 原文地址:https://www.cnblogs.com/renbo/p/8799098.html
Copyright © 2020-2023  润新知