记录:基本类型数组去重
数组去重是一道很常见的面试题,方法也是不尽相同,除去最常见的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引擎来说这点内存可以忽略不计。