总结
- 双 for 循环去重
- 借用对象属性不能相同特点去重
- 新建数组去存储不同值(includes 与 indexOf 的区别)
- ES6 Set去重
方法一:双 for 循环
- 原理:依次拿出数组中的每一项,和它后面的所有剩余项进行比较,如果有相同的就删除
- NaN 与任何值都不相等,包括 NaN 本身
null==undefined(true)
- 对象和对象比较的是空间地址:
{}=={}(false)
1 | var arr = [1, 2, 2, 2, {}, {}, NaN, NaN, null, null, undefined, undefined]; |
方法二:借用对象属性不能相同特点去重
- 原理:创建一个空对象,去遍历数组中的每一项,把数组中的每项当成属性名和属性值,给此对象添加,在添加的过程中,如果此对象已经有此项,说明重复,在数组中删除此项
- 访问对象的属性如果属性不存在返回 undefined,
obj[null]
返回 undefined
1 | var arr = [1, 2, 2, 2, {}, {}, NaN, NaN, null, null, undefined, undefined]; |
方法三:新建数组去存储不同值
- 原理:创建一个新数组,去遍历数组中的每一项,如果新数组没有这个(利用 indexOf) push 进新数组
- indexOf 比较参数与数组中的每一项时,会使用全等操作符(===)
1 | var arr = [1, 2, 2, 2, {}, {}, NaN, NaN, null, null, undefined, undefined]; |
- 原理:与上面那个同理
- includes 可以去重 NaN
1 | var arr = [1, 2, 2, 2, {}, {}, NaN, NaN, null, null, undefined, undefined]; |
includes 与 indexOf 的区别
- 如果数组里只有 NaN,利用 indexOf 是无法判断的,必须使用 includes 方法
1 | var arr = [NaN] |
方法四:ES6 Set去重
- 这种方法无法去掉 “{}” 空对象
1 | var arr = [1, 2, 2, 2, {}, {}, NaN, NaN, null, null, undefined, undefined]; |