如何实现数组去重

https://zhuanlan.zhihu.com/p/111805723

使用Set

  1. const unique = (arr)=>{
  2. return Array.from(new Set(arr))
  3. }
  4. console.log(unique([1,5,2,3,4,2,3,1,3,4]))
  5. // [1, 5, 2, 3, 4]

或者

  1. const numbers = [2,3,4,4,2,3,3,4,4,5,5,6,6,7,5,32,3,4,5]
  2. console.log([...new Set(numbers)])
  3. // [2, 3, 4, 5, 6, 7, 32]

优点:简洁方便,可以区分NaN
缺点:无法识别相同对象和数组

map实现数组去重

主要思路:创建一个空 Map,遍历原始数组,把数组的每一个元素作为 key 存到 Map 中,因为 Map 中不会出现相同的 key 值,所以最终得到的 Map 中的所有 key 值就是去重后的结果。

  1. const unique = (arr)=>{
  2. let map = new Map();
  3. let array = new Array(); // 数组用于返回结果
  4. for(let i = 0; i<arr.length; i++){
  5. if(map.has(arr[i])){ // 判断 map 中是否已有该 key 值
  6. map.set(arr[i],true) // 后面的true 代表该key值在原始数组中
  7. }else{ // 如果 map 中没有该 key 值,添加
  8. map.set(arr[i],false)
  9. array.push(arr[i])
  10. }
  11. }
  12. return array
  13. }
  14. let arr = [1,5,2,3,4,2,3,1,3,4]
  15. console.log(unique(arr))
  16. //[1, 5, 2, 3, 4]

相比Set结构去重消耗时间较长

indexOf 实现数组去重

  1. const unique = (arr)=>{
  2. if(!Array.isArray(arr)) return
  3. const array = []
  4. for(let i = 0; i<arr.length; i++){ //遍历数组,如果arr的元素在空数组中不存在,返回-1,加到空数组中
  5. array.indexOf(arr[i]) === -1 ? array.push(arr[i]) : array
  6. }
  7. return array
  8. }
  9. const arr = [1,5,2,3,4,2,3,1,3,4]
  10. console.log(unique(arr))
  11. //[1, 5, 2, 3, 4]

优点:ES5常用方法,兼容性高,易于理解
缺点:无法区分NaN,需要特殊处理