方法一:用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]