数组去重
Set方法
1 | let arr = [1, 2, 2, 3, 3, 4, 5] |
indexOf
1 | let arr = [1, 2, 2, 3, 3, 4, 5] |
正常情况下使用这种方式没问题,但是当arr
中有NaN
时:
1 | let arr = [1, 2, 2, 3, 3, 4, 5, NaN, NaN] |
结果与预期的不符,因为indexOf
判断NaN
时,结果始终为-1
。
我们可以使用includes
进行判断,includes
会正确判断NaN
,但是与Object.is()
表现不同的是+0
和-0
,includes
判断+0
、-0
为true
。
关于Object.is()
请查看:在相等比较中使用 Object.is()让结果更准确
1 | let arr = [1, 2, 2, 3, 3, 4, 5, NaN, NaN] |
使用对象Key
1 | let arr = [1, 2, 2, 3, 3, 4, 5, NaN, NaN] |
但是如果下面的情况,使用这种方式就会有问题:
1 | let arr = [1, 2, 2, 3, 3, 4, 5, '5', NaN, NaN] |
我们发现'5'
被过滤掉了,因为Object
的会把key
默认转换成字符串,所以识别5
时,会当成'5'
处理,所以再判断'5'
时,对象中已经存在。
对于这样的情况,我们可以使用ES6的Map
结构。
1 | let arr = [1, 2, 2, 3, 3, 4, 5, '5', NaN, NaN] |
我们看到Map
并没有把5
转换成'5'
。
关于Map
更多了解,请查看:Set 和 Map 数据结构