談談 js 去重方法的那點事

找抽的小陀螺發表於2017-10-08

今天看了一個面試題 陣列去重至少三種方法 下面寫寫幾種方法

  • 根據下標

      var arr = ['f', '0', '3', 'f', 'd', '2', 'd', 'd']
      var newarr = [] //定義一個新的陣列
      for (var i= 0; i< arr.length; i++) {   //遍歷arr 每一項
          if(newarr.indexOf(arr[i]) == -1) {  //判斷newarr陣列是否存在arr項 
              newar.push(arr[i])  //newarr裡面不存在就push
          }
      }
      console.log(newarr)  //["f", "0", "3", "d", "2"]複製程式碼

    indexOf() 返回某個指定字串值在字串中首次出現的位置 如果沒有就返回 -1
    newarr這個陣列 裡面找下是否存在arr陣列重複的項 沒有就push

  • 常規去重

       var arr = ['f', '0', '3', 'f', 'd', '2', 'd', 'd']
       function unique(arr) {
           var newarr = [arr[0]] //這裡構建一個newarr陣列 且存放了第一個值 以便下面對比
           for (var i= 1; i< arr.length; i++) {  
              var isrepeat = false
              for (var j= 0; j< newarr.length; j++) {  //迴圈兩個陣列做對比
                  if(arr[i] == newarr[j]) {
                      isrepeat = true 
                      break      //這裡判斷下迴圈arr時候 跟newarr對比 相等就跳出 且給出標記 當前arr陣列第幾個是出現重複的
                  }
              }
              if (!isrepeat) {
                  newarr.push(arr[i])  //這裡 true標記的都是重複的  false都是可以新增的
              }
           }
           return newarr //完事返回
       }
       console.log(unique(arr))    //["f", "0", "3", "d", "2"]複製程式碼

    這種做法 要迴圈原陣列 還要迴圈新陣列 迴圈著比較 確實效率有點低

  • 排序後去重

      var arr1 = ['f', '0', '3', 'f', 'd', '2', 'd', 'd']
      console.log(arr1.sort()) //["0", "2", "3", "d", "d", "d", "f", "f"] 
      function unique(arr1) {
        var arr = arr1.sort()  
        var newarr = [arr[0]] //還是要構建一個newarr陣列 存放原陣列第一個元素
        for(var i= 1; i<arr.length; i++) {
            if (arr[i] !== newarr[newarr.length-1]) { 
                newarr.push(arr[i])
            }
        }
        return newarr
      }
      console.log(unique(arr1)) //["0", "2", "3", "d", "f"]複製程式碼

    上來排序 這樣使得有重複的元素肯定在一塊 這樣 就可以用
    if(arr[i] !== newarr[newarr.length-1]) 判斷 因為都是挨著的 只要判斷原陣列元素跟新陣列最後一個元素比較就可以
    排序在去重 有一個不好的地方就是 最後結果也給排序了 改變了原陣列

  • 物件屬性去重(也是網上大家推薦使用的)

      var arr = ['f', '0', '3', 'f', 'd', '2', 'd', 'd']
      function unique(arr) {
          var newarr = [] //構建newarr 陣列
          var obj = {}  //構建一個物件obj
          for (var i= 0; i< arr.length; i++) {
              if (!obj[arr[i]]) { //如果元素跟陣列對比
                  newarr.push(arr[i])
                  obj[arr[i]] = 1 // 元素內容作為物件屬性
              }
          }
          return newarr 
      }
      console.log(unique(arr)) //["f", "0", "3", "d", "2"]複製程式碼

    這樣物件屬性做法 將陣列arr 元素跟obj物件對比 看看物件裡面這個屬性 不存在就新增到newarr 並將當前陣列的這個屬性設定一個值表示物件中有了這個值
    這樣迴圈完就將 物件中有的屬性拋去 剩下去重後的元素

    js這些邏輯在演算法中是很基礎的 還有很多好玩的東西 學習無止境

相關文章