js 数组去重方法对比

1 最简单方法

// 判断值是否在数组中,如果不在则加入,ie8不支持 indexOf, O(n2)
function uniq (arr) {
  let result = []
  for (let i = 0, len = arr.length; i < len; i++) {
     if (result.indexOf(arr[i] < 0) {
        result.push(arr[i])
     }
  }
  return result
}

2 使用 Map 保存

  // 使用额外的内存保存,速度快,由于 map 的key 值不区分类型,会将不同类型的值作为相同的值处理,因此需要额外保存类型, 接近 O(n)
  function uniq (arr) {
     let result = []
     let map = {}
     for (let i = 0, len = arr.length; i < len; i++) {
       const item = arr[i]
       const type = typeof item
       if (!map[item]]) {
         result.push(item)
         map[item] =[ type]
       } else if (map[item].indexOf(type) < 0) {
        result.push(item)
        map[item].push(type)
      }
     }
    return result
  }

3 数组排序,只添加前面不同的值

// 会打乱原数组顺序,只能去除同类型的值 o(nlogn)
function uniq (arr) {
  if (arr.length <= 1) return arr 
  arr.sort()
  let result = [arr[0]]
  for (let i = 1, len = arr.length; i < len; i++) {
    if (arr[i] !== arr[i-1]) result.push(arr[i])
  }
  return result
}

4 数组下标法

// 只将第一次出现加入新数组 O(n2)
function uniq (arr) {
  let result = []
  for (let i = 0, len = arr.length; i < len; i++) {
    const item = arr[i]
    if (arr.indexOf(item) === i) result.push(arr[i])
  }
  return result
}

5 将最后出现的值加入数组

function uniq (arr) {
  let result = []
  let len = arr.length
  for (let i = 0; i < len; i++) {
    for (let j = i +1; j < len; j++) {
      if (arr[i] === arr[j] {
       i++
       j = i
     }
    }
    result.push(arr[i])
  }
  return result
}

6 ES6

function uniq (arr) {
  return Array.from(new Set(arr))
}

7 filter 实现

// 与方法四相同
function uniq (arr) {
  return arr.filter((item, index) => arr.indexOf(item) === index))
}

你可能感兴趣的:(js 数组去重方法对比)