数组去重几种方法

241 阅读1分钟

1.了解Map、Set的特性

Map:
new Map() 一个键值对集合,每个key对应一个value。
方法:
1. get(key) 获取key对应的value
2. set(key,value) 设置键值对 
3. has(key) 是否存在key
4. delete(key) 删除key对应的键值对

Set:
new Set() 一组key的组合,不存储value,key不能重复,重复元素在set中自动被过滤
方法:
1. add()
2. delete()

二 需求: [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10] 将数组扁平化去重,然后升序排列。 分析:首先需要将数组扁平化,然后去重

一.数组扁平化的几种方式

  • flat(depth):深度递归数组,depth传入递归的层级,默认为1

  • String(arr).split(',') 或者 arr.toString().split(',') 或者 arr.join(',')用toSring()会改变原始数据的类型,所以还需要用map遍历数组转为number

      arr.map(item => {
          return parseInt(item)
      })
    

  • reduce 遍历每一项,如果是数组则遍历 否则cancat()

     function flatten(arr){
         return arr.reduce((result,item) => {
             result.cancat(Array.isArray(item) ? flatten(item) : item)
         },[])
     }
    
  • 递归

      let arr1 = []
      function flatten(arr){
          arr.map(item => {
              if(Array.isArray(item)){
                  flatten(item)
              }else{
                  arr1.push(item)
              }
          })
      }
    
  • es6的解构

      [].cancat(...[1,2,3,[4,5,[6,7],6],7])
    

二、去重

  • 根据上文介绍的Set的特性,是一个键不重复的集合

      Array.from(new Set(arr))
    
  • indexOf()

      function noRepeat(arr){
          let arr1 = []
          arr.map(item => {
              if(arr1.indexOf(item) == -1){
                  arr1.push(item)
              }
          })
      }
    
  • 遍历双循环

      let arr = [1,2,2,3,3,4,1]
      function noRepeat(){
          for(i=0;i<arr.length;i++){
              for(j=i+1;j<arr.length;j++){
                  if(arr[j] == arr[1]){
                      arr.splice(j,1)
                      j--
                  }
              }
          }
      }
      return arr