记录:基本类型数组去重

数组去重是一道很常见的面试题,方法也是不尽相同,除去最常见的Set方法外,记录两种简便的数组去重方法

        let arrs=[1,2,3,1,2,3,NaN,NaN,null,null,undefined,undefined,'a','a']


        function dery(arr){
            return arr.filter((item,index)=>arr.indexOf(item)===index)
        }
        console.log(dery(arrs))  //[1, 2, 3, null, undefined, "a"]

这个数组把我们能考虑到基本类型都考虑到了,但是NaN是一个特殊的值,在进行indexOf的时候 NaN是在数组中取不到的,所以就把NaN去除掉了。因为indexOf也是进行了一个遍历,所以这种方法时间复杂度为O(n²)。

接下来看另一种方法:
    function dery(arr){
        let obj={}
            return arrs.filter(item=>obj.hasOwnProperty(typeof item+item)?false:(obj[typeof item+item]=true))
        }
        console.log(dery(arrs)) //[1, 2, 3, NaN, null, undefined, "a"]
这种方法是引入一个空对象来对数组中元素进行判断,如果对象中没有这个 元素,将这个元素设为对象的属性并返回true,如果有这个元素就说明之前已经遍历到了,是重复的元素,返回false。因为是将数组元素类型+元素本身转为字符串设置为的对象属性和,所以遇到NaN时,默认下一个NaN与上一个相等,所以这种方法不能去重NaN。从性能上来考虑,时间复杂度为O(n),但是开辟了一个对象,所以占用了内存,但对于V8引擎来说这点内存可以忽略不计
posted @ 2019-12-26 09:53  温润如玉Ayu  阅读(317)  评论(0编辑  收藏  举报