超實用的JS數組去重

  • 2019 年 11 月 12 日
  • 筆記

一、簡單的去重方法,利用數組indexOf方法

// 最簡單數組去重法  /*  * 新建一新數組,遍歷傳入數組,值不在新數組就push進該新數組中  * IE8以下不支援數組的indexOf方法  * */  let array = [1, 2, 3, 2, 2, 3, 4, 3, 4, 5];   // 數組去重  function unique(ary) {     let newAry = [];     for (let i = 0; i<ary.length; i++) {        if (newAry.indexOf(ary[i]) === -1) {          newAry.push(ary[i]);        }     }     return newAry;  }  array = unique(ary);  console.log(array);

二、優化遍曆數組法

/*==數組去重==*/  let ary = [1, 2, 3, 2, 2, 3, 4, 3, 4, 5];  /*   * 1.依次拿出數組中的每一項(排除最後一項:最後一項後面沒有需要比較的內容)   * 2.和當前拿出項後面的每一項依次比較   * 3.如果發現有重複的,我們把找到的這個重複項在原有數組中刪除掉(splice)   */  //=>i<ary.length-1:不用拿最後一項  for (let i = 0; i < ary.length - 1; i++) {      let item = ary[i];      //=>item:依次拿出的每一項      //=>i:當前拿出項的索引      //=>和當前項後面的每一項比較:起始索引應該是i+1  k < ary.length找到末尾依次比較      for (let k = i + 1; k < ary.length; k++) {          //ary[k]:後面需要拿出來和當前項比較的這個值          if (item === ary[k]) {              //=>相等:重複了,我們拿出來的K這個比較項在原有數組中刪除              // ary.splice(k, 1);              /*               * 這樣做會導致數組塌陷問題:當我們把當前項刪除後,後面每一項都要向前進一位,也就是原有數組的索引發生了改變,此時我們k繼續累加1,下一次在拿出來的結果就會跳過一位               * 原數組 [1,2,3,4]               * i=1 =>2 我們把這一項幹掉,然後i++,i=2               * 原數組 [1,3,4]               * i=2這一項是4,3這一項就錯過了               * ...               */              ary.splice(k, 1);//=>刪除後不能讓k累加了              k--;//=>刪除後先減減,在加加的時候相當於沒加沒減          }      }  }  console.log(ary);

三、對象鍵值法去重

let ary = [1, 2, 3, 2, 2, 3, 4, 3, 4, 5];  // 使用對象屬性名不重複的特點去重      let obj={};      let newAry = [];      for (let i=0; i<ary.length; i++) {        let item = ary[i];        if (typeof obj[item] === 'undefined') {          // 如果obj[item]是undefined說明對象obj中還未存入鍵值item,我們向newAry中加入item          newAry.push(item)        }        obj[item] = item;      }      ary = newAry      console.log(ary)

四、ES6中Set方法去重

let ary = [1, 2, 2, 2, 1, 2, 3, 2, 3, 2, 1],  console.log(Array.from(new Set(ary)));  //=>基於ES6 SET實現去重  或者console.log([...new Set(ary)]);

我用let代替了var聲明變數,還未學ES6的同學用var可以實現,不影響功能實現~