数组去重

版权声明:本文为博主原创文章,转载请附上原文地址 https://blog.csdn.net/writing_happy/article/details/79978273

数组去重

可参考此篇

一个宇宙通用的去重方案

function unique(arr){
  let newArr = []
  for(let i = 0, length = arr.length; i < length; i++){
    for(var j = 0, len = newArr.length; j < len; j++){
      if(newArr[j] === arr[i]){  break  }
    }
    if(j === len){  newArr.push(arr[i])  }
  }
  return newArr
}
var arr = [1,4,3,NaN,{},{},5,9,8,8,6,5,NaN,3]
console.log(unique(arr)) //[1, 4, 3, NaN, {}, {}, 5, 9, 8, 6, NaN]

  鉴于{} !== {}NaN !== NaN,所以它们都不算作重复。

用数组的indexOf方法实现

  Array.prototype.indexOf()方法返回的是元素在数组中第一次出现的位置,如果元素不在数组中,那么返回-1。

function unique(arr){
  let newArr = []
  for(let i = 0, len = arr.length; i < len; i++){
    let current = arr[i]
    if(newArr.indexOf(current) === -1){
      newArr.push(current)
    }
  }
  return newArr
}
var arr = [1,4,3,NaN,{},{},5,9,8,8,6,5,NaN,3]
console.log(unique(arr)) // [1, 4, 3, NaN, {}, {}, 5, 9, 8, 6, NaN]

用filter+indexOf实现

function unique(arr){
  return arr.filter( (value, index, array) => {
    return arr.indexOf(value) === index    
  })
}
var arr = [1,4,3,NaN,{},{},5,9,8,8,6,5,NaN,3]
console.log(unique(arr))  // [1, 4, 3, {}, {}, 5, 9, 8, 6]

  这个方法会忽略NaN。

ES6的Set对象

function unique(arr){
  var mySet = new Set(arr)
  return Array.from(mySet)
}
//Array.from()可以将set对象转换为array对象,展开操作符...也可以。
//所以return后边也可以用[...mySet]
var arr = [1,4,3,NaN,{},{},5,9,8,8,6,5,NaN,3]
console.log(unique(arr))  //[1, 4, 3, NaN, {}, {}, 5, 9, 8, 6]

  可以实现NaN的去重。
  上边的函数可以简化成function unique(arr){ return [...new Set(arr)]}

数组的filter方法加Map对象也可以实现

  但是我觉得不如Set对象(逃)

function unique (arr) {
    var myMap = new Map()
    return arr.filter( (a) => {
     return !myMap.has(a) && myMap.set(a)  
    })
}

var arr = [1,4,3,NaN,{},{},5,9,8,8,6,5,NaN,3]
console.log(unique(arr))  //[1, 4, 3, NaN, {}, {}, 5, 9, 8, 6]

  其中myMap.set(a)是在对象myMap里边添加一个key为a的新元素,如果是myMap(a,1)表示给这个新元素的value设置为1。myMap.has(a)用来判断对象myMap方法是否存在key为a的新元素。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页