Js数组去重
1.问题
数组去重老老生常谈的问题了,网上也很多对于这方面的解决问题,如果是一些简单的数据,我们可以使用 set数据结构 或 for循环+if等判断 或 Array.filter 等等,常规的方式还是挺多的,但是对于存在特殊数据类型的数组,比如 NaN和对象类型{},上面这些方法就有点捉襟见肘
2.解决方式
function unique(arr) {
let obj = {};
return arr.filter(item => {
if (obj.hasOwnProperty(typeof item + JSON.stringify(item))) {
return false
} else {
obj[typeof item + JSON.stringify(item)] = true
return true;
}
})
}
思路就是将每一项JSON化,然后拼接在类型检测的后面,
那么类型检测是否有必要呢?
来看一下下面的例子
- 不加类型检测的话
console.log(JSON.stringify(null));//null
console.log(JSON.stringify(NaN));//null
- 添加类型检测
console.log(typeof null + JSON.stringify(null));//objectnull
console.log(typeof NaN + JSON.stringify(NaN));//numbernull
可以看出stringify处理null和NaN的返回值是一样,但是typeof进行类型检测我们就知道NaN是属于number类型,而null被划为object(你应该晓得的),所以如果不加类型检测,NaNcy和null就会被当成同一个东西处理,当数组中同时存在两者时,不加类型检测就会只剩一个,但是我们知道这两个是有区别的,因此加类型检测是有必要的
3.最后
这个肯定也是存在问题,假如里面的item是一个很大的对象类型的话,stringify出来的东西也是一大串的,还不知道这个要怎么解决,就先写这样吧。