js數組去重的方法

最近在面試,僥倖面試成功,這裏列舉一下數組去重的方法
這裏咱們先隨機生成一個10000項的數組,經過不一樣方法的對數組進行去重,來比較一下速度。javascript

首先生成數組java

function product(){
        var arr=[]
          for(var i=0;i<10000;i++){
            var a=randomNum()
              arr.push(a)
          }
          return arr
      }
 function randomNum(){
        return Math.ceil((Math.random()*10000))
 }
 var arr=product()
 console.log(arr)

1.首先是經過雙循壞的方法
  聲明一個新的空數組,每次對新數組進行檢索,若是查不到,則將元素插入。時間複雜度爲O(n2)
貼上代碼面試

function isRepeat2(arr){
  var newArr=[];
    for(var i=0;i<arr.length;i++){
          if(newArr.indexOf(arr[i])==-1){//沒查到
              newArr.push(arr[i])
          }
    }
    return newArr
}

2.這種思路是先對數組進行排序,而後比較相鄰的元素,若是重複就刪除。時間複雜度也爲O(n2)數組

因爲JS對sort排序進行了優化,會比第一種方法速度要快一些
代碼:dom

function isRepeat(arr){
  arr=arr.sort((a,b)=>{
      return a-b
  })
    for(var i=0;i<arr.length-1;i++){
      if(arr[i]==arr[i+1]){
          arr.splice(i,1)
          i--
      }
    }
    return arr
}

3. 利用hash對象進行排序優化

function set(arr) {
var hash = {}
var arr1 = []
for (var i of arr) {
if (!hash[i]) {
arr1.push(i)
hash[i] = 1
}
}
return arr1
}

利用hash對象的key值不重複,來判斷是否插入新的元素,因爲只進行了一次遍歷 時間明顯縮短。時間複雜度爲O(n)
4.利用ES6的Set對象
Set對象的相似於數組,其值不能重複spa

function isRepeat3(arr){
  const s = new Set();
  arr.forEach(x => s.add(x));
  return arr
}

這種跟第3種速度差很少
下面貼一下四種方式的運行時間比較code

console.time()
console.log(isRepeat(arr))
console.timeEnd()
console.time()
console.log(isRepeat2(arr))
console.timeEnd()
console.time()
console.log(isRepeat3(arr))
console.timeEnd()
console.time()
console.log(set(arr))
console.timeEnd()

 

 

能夠看到,4種去重方式的運行速度,明顯3,4速度要快一些
你學到了嗎?
歡迎各位批評指正

對象

相關文章
相關標籤/搜索