题解 | #数组去重#
数组去重
http://www.nowcoder.com/practice/0b5ae9c4a8c546f79e2547c0179bfdc2
方法一:用indexOf判断,将{} NaN也去重
- indexOf无法识别{}、NaN
- indexOf可以识别 字符串、数字、布尔值、undefined、null
- 用typeof识别 object =>null {}
- number => NaN 0 11
- undefined => undefined
- boolean =>false true
- string =>'a'
Array.prototype.uniq = function () { let arr = this let newArr = [] let oNum = 0 let nNum = 0 arr.forEach(item=>{ if(newArr.length==0) { newArr.push(item) } let type = typeof item // 1.判断除NaN,{},null,数字之外元素 if(type!="object"&&type!="number"&&newArr.indexOf(item)<0) { newArr.push(item) } //2.判断{},null if(type=="object") { if(newArr.indexOf(item)<0&&item==null) {//null newArr.push(item) }else if(oNum<1){//{} oNum++ newArr.push(item) } } //3.判断NaN、数字 if(type=="number") { if(isNaN(item)&&nNum==0) {//NaN nNum++ newArr.push(NaN) } if(!isNaN(item)&&newArr.indexOf(item)<0){ newArr.push(item) } } }) return newArr }
方法二:用set()去重
- 定义:新数据结构Set,类似于数组,但成员值不重复
- 使用: new Set()
- Set有四个操作方法和属性:
size:返回值的个数
add(val):添加值,返回set结构
delete(val):删除值,返回布尔值
has(val):是否包含,返回布尔值
clear():清除所有成员,无返回值 - 遍历方法:.forEach()、.keys()、.values()、.entries()
Array.prototype.uniq2 = function () { //[...new Set(this)] return Array.from(new Set(this)) }
示例
[true, false, null, undefined, NaN, 0, 1, {}, {}, 'a', 'a', NaN].uniq() //方法一:[true, false, null, undefined, NaN, 0, 1, {}, "a"] //方法二:[true, false, null, undefined, NaN, 0, 1, {}, "a", NaN]