Javascript—数组去重

75 阅读1分钟

一、去重

  • 重复数组:[1, 2, 3, 1, 2, 4] -> [1, 2, 3, 4]
  • ①、循环遍历+indexOf ②、排序后去重 ③、reduce或filter ④、Set

1. 循环遍历+indexOf

function unique(arr) {
  let res = []
  for (let i = 0; i < arr.length; i++) {
    let current = arr[i]
    if (res.indexOf(current) === -1) {
      res.push(current)
    }
  }
  return res
}
unique(arr)

2. 排序后去重

  • 通过sort排序后判断当前值是否与上一个值相等,如果是,则说明重复,不重复的时候添加进res
function unique(arr) {
  let res = []
  let sortArr = arr.sort()
  let seen
  for (let i = 0; i < sortArr.length; i++) {
    if (!i || seen !== sortArr[i]) {
      res.push(sortArr[i])
    }
    seen = sortArr[i]
  }
  return res
}
unique(arr)

3. reduce、filter

3.1 reduce

let myArray = ['a', 'b', 'a', 'b', 'c', 'e', 'e', 'c', 'd', 'd', 'd', 'd']
let myOrderedArray = myArray.reduce(function (accumulator, currentValue) {
  if (accumulator.indexOf(currentValue) === -1) {
    accumulator.push(currentValue)
  }
  return accumulator
}, [])

3.2 fillter

function unique(arr) {
  return arr.filter((item, index) => {
    return arr.indexOf(item) === index
  })
}
unique(arr)

4. Set

4.1 什么是Set?

  • Set是ES6新增的一种数据结构,类似于数组,但是成员的值都是唯一的

4.2 实现

  • Set+...
[...new Set(array)]
  • Set+Array.from()
Array.from(new Set(arr))

二、获重

1. filter

function getDuplicates(arr) {
  return arr.filter((item, index) => arr.indexOf(item) !== arr.lastIndexOf(item) && arr.indexOf(item) === index);
}

2. Set

  • 时间复杂度为O(n)
function getDuplicates(arr) {
  const duplicates = [];
  const unique = new Set();
  for (const item of arr) {
    if (unique.has(item)) {
      duplicates.push(item);
    } else {
      unique.add(item);
    }
  }
  return duplicates;
}