js 數組去重(7種)

  第一次寫技術博客,以前老是認爲寫這些會很浪費時間,還不如多看幾篇技術博文。但。。。但昨天不知道受了什麼刺激,好像有什麼在驅使着本身要寫同樣,因此纔有了今天的第一篇博文。總以爲應該要堅持這樣寫下去。初次寫,並不知道寫些什麼,就慢慢地整理些以往的總結吧!數組

  文中若是有哪裏寫得不許確或者有任何建議的,歡迎絕不吝嗇地指出!數據結構

  如今,咱們就切入主題吧!哈哈~~ 下面是我整理的目前想到的幾種數據去重方法:性能

 

方法一:原理:利用indexOf()遍歷數組,若是臨時數組找不到該元素,則push到臨時數組,不然不作處理spa

function uniqArr1(arr) {
  var res = [];

  for (var i = 0,len = arr.length; i < len; i++) {
        if (res.indexOf(arr[i]) == -1) {
          res.push(arr[i]);
        }
      }

      return res;
    }
}

 

方法二:原理:一樣利用indexOf()遍歷數組,若是元素首次出現位置和它的索引相等,則說明不是重複元素,push到臨時數組,不然不作處理code

function uniqArr2(arr) {
  var res = [arr[0]];

  for (var i = 1,len = arr.length; i < len; i++) {
    if (arr.indexOf(arr[i]) == i) {
      res.push(arr[i]);
    }
  }

  return res;
}

 

方法三:原理:利用對象鍵值惟一性,若是對象沒有該屬性,則添加該屬性,同時將該元素push到臨時數組對象

function uniqArr3(arr) {
  var obj = {},
  res = [];

  for (var i = 1,len = arr.length; i < len; i++) {
    if (!obj[arr[i]]) {
      obj[arr[i]] = true;
      res.push(arr[i]);
    }
  }

  return res;
}

 

方法四:原理:一樣利用對象鍵值惟一性,惟一不一樣的地方是這裏再也不使用臨時數組變量,而是利用Object.keys()方法將去重後的結果返回blog

注意:這裏的返回結果跟上述幾種不太一致,緣由是這裏是對象的key,每一項都是字符串的形式,同時返回的結果數組元素的順序是不肯定的排序

function uniqArr4(arr) {
  var obj = {};

  for (var i = 1,len = arr.length; i < len; i++) {
    if (!obj[arr[i]]) {
      obj[arr[i]] = true;
    }
  }
  
  return Object.keys(obj);
}

 

方法五:原理:先對原數組進行排序,臨時數組先存儲第一個元素,而後從第二個元素開始循環判斷排序後的原數組(arr)是否與臨時數組(res)的第length-1個元素(即res的最後一個元素,也即res每次新添加的元素)是否相等,若不相等,則push到res,這樣就確保了每次push到res中的都是不重複的。索引

注意:這裏返回的結果數組一樣順序是有變化的(方法四順序也有變化)字符串

function uniqArr5(arr) {
  arr.sort();
  var res = [arr[0]];

  for (var i = 1,len = arr.length; i < len; i++) {
    if (arr[i] !== res[res.length -1]) {
      res.push(arr[i]);
    }
  }

  return res;
}

 

方法六:原理:嵌套循環,若是相等,則截掉後面的,這裏要注意splice會影響到原數組,因此這裏從新計算了len值和j值。

function uniqArr6(arr) {
  var len = arr.length;

  for (var i = 0; i < len; i++) {
    for (var j = i + 1; j < len; j++) {
      if (arr[i] === arr[j]) {
        arr.splice(j, 1);
        len = arr.length;
        j--;
      }
    }
  }

  return arr;
}

 

方法七:原理:ES6新的數據結構set,相似數組,但成員的值都是惟一的,因此利用這個特性能夠作到數組去重

function uniqArr7(arr) {
  var res = new Set(arr);
  return [...res];
}

 

暫且先分析了幾種去重方法的實現原理,關於上述幾種去重方法的性能分析後面將進行補充。。。 

相關文章
相關標籤/搜索