手写数组去重

34 阅读1分钟
  1. 使用 Set
const uniq = (a) => {
  
  return [...new Set(a)]
  
}
  1. 使用计数排序的思路
const uniq = function(a){
  let map = {}
  for(let i =0;i < a.length;i++){
    let number = a[i]
    if(number === undefined){continue}
    if(number in map){continue}
    map[number] = true
  }
  return object.keys(map)
  // or use for...in
}

因为object的key值只能是字符串或symbol,所以该代码的缺点是只支持字符串

  1. 弥补2的缺点
let remove = function(arr) {
        let obj = {}
        for(let i = 0;i<arr.length;i ++) {
            if(!obj[arr[i]]){
                obj[arr[i]] = true
            } else {
                arr.splice(i,1)
                i--
            }
        }
    }
  1. 用 Map
const uniq = function(a){
  let map = new Map()
  for(let i =0;i < a.length;i++){
    let number = a[i]
    if(number === undefined){continue}
    if(map.has(number)){continue}
    map.set(number, true)
  }
  return [...map.keys()]
}

这个方法除了兼容不太好,没啥问题。因为 Map 的 key,不单单是字符串。

  1. 使用 filter
const removeDuplicate = function(arr){
  return arr.filter((value,index) => arr.indexOf(value) === index)
}
  1. 在原数组上去重
const removeDuplicate = function(arr){
  let set = new Set()
  for(let i = 0;i < arr.length;i++){
    let num = arr[i]
    if(!set.has(num)){
      set.add(num)
    } else {
      arr.splice(i,1)
      i--
    }
  }
}
  1. 如果你想去重内容相同的数组或对象
// 例如 const arr = [3, 3, {a: 1}, {a: 1}, [3,4,5], [3,4,5], 'a', 'a']
// 你可以这样去做
function removeDuplicate(arr) {
  let set = new Set()
  return arr.filter(v => {
    if(typeof v === 'object' && v!== null) {
      v = JSON.stringify(v)
    } 
    if(set.has(v)) return false
    set.add(v)
    return true
  })
}