超實用的JS數組去重


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

// 最簡單數組去重法
/*
* 新建一新數組,遍歷傳入數組,值不在新數組就push進該新數組中
* IE8以下不支持數組的indexOf方法
* */
let ary = [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可以實現,不影響功能實現~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM