1. 程式人生 > 實用技巧 >陣列去重的幾種方式

陣列去重的幾種方式

1.reduce實現陣列去重

var myArray = [1,2,2,3,4,4];
var myOrderedArray = myArray.reduce(function (accumulator, currentValue) {
    //accumulator有初始值 賦值為空陣列   空陣列中沒有1 indexOf為-1 進入迴圈   
    console.log(accumulator.indexOf(currentValue) )
  if (accumulator.indexOf(currentValue) === -1) {
      //[1] => 在執行 陣列變為[1,2]  indexOf 是返回陣列當前值得下標 2第一次進去得時候不存在是-1進入迴圈
      //push進去陣列 第二個2存在 返回下標 return出去 以此類推 實現陣列去重
    accumulator.push(currentValue);
  }
  return accumulator
}, [])
console.log(myOrderedArray);
================================================================
let arr = [1,2,1,2,3,5,4,5,3,4,4,4,4];
let result = arr.sort().reduce((init, current) => {
    if(init.length === 0 || init[init.length-1] !== current) {
        init.push(current);
    }
    return init;
}, []);
console.log(result); //[1,2,3,4,5]

2.includes 去重

let myArray = [1, 2, 2, 3, 4, 4];
let newArr = [];
for (let i = 0; i < myArray.length; i++) {
    let item = myArray[i];
    //驗證新陣列中是否存在這一項
    if(newArr.includes(item)){continue}
    //新陣列中不存在這一項,直接加入到新陣列中
    newArr.push(item)
}
console.log(newArr) //原陣列未去重,新陣列去重了

======================================================================
let myArray = [1, 2, 2, 3, 4, 4];
let newArr = [];
myArray.forEach((item)=>{
     //驗證新陣列中是否存在這一項
    if(newArr.includes(item)){
        return
    }
    newArr.push(item)
})
console.log(newArr) //原陣列未去重,新陣列去重了
//ie  6 7 8 不相容

3.雙重for迴圈去重

一張圖瞭解陣列塌陷問題

function unique(arr){      
        for(var i=0; i<arr.length; i++){
           //讓當前項和後面一項進行比較(迴圈);
            for(var j=i+1; j<arr.length; j++){
                if(arr[i]==arr[j]){         //第一個等同於第二個,splice方法刪除第二個
                    arr.splice(j,1);
                    j--;//陣列塌陷了 j後面得每一項索引都提前了一位,下一次要比較得應該還是j這個索引得內容
                }
            }
        }
return arr;
}

4.indexOf去重

function bb(arr){
    let newArr = [];
    for(let i = 0;i<arr.length;i++){
        if(newArr.indexOf(arr[i]) === -1){
            newArr.push(arr[i])//indexOf  不存在返回-1  滿足條件加進去
        }
    }
    return newArr;
}//ie  6 7 8 不相容function bb(arr){
    let newArr = [];
    for(let i = 0;i<arr.length;i++){
        if(newArr.indexOf(arr[i]) === -1){
            newArr.push(arr[i])//indexOf  不存在返回-1  滿足條件加進去
        }
    }
    return newArr;
}//ie  6 7 8 不相容

5.物件去重

    let arr = [1, 2, 2, 1, 3, 5,6,25];
    let obj = {};
    let newArr = [];
    for (let i = 0; i < arr.length; i++) {
        //物件獲取數字物件  用中括號得方法
        if (obj[arr[i]] === arr[i]) {
            //說明值已經存在
            arr.splice(i,1); 
            i--;    //陣列塌陷問題 索引向前提一位
            continue
        } else {
            obj[arr[i]] = arr[i]  //物件賦值
            newArr.push(arr[i])
        }
    }
    console.log(obj)// {1: 1, 2: 2, 3: 3, 5: 5, 6: 6, 25: 25}
    console.log(newArr)// [1, 2, 3, 5, 6, 25] 
//缺陷  物件類得值不能處理
============================較好的方法 不使用splice陣列去重=====================
  let arr = [1, 2, 2, 1, 3, 5, 6, 25];
let obj = {};
let newArr = [];
for (let i = 0; i < arr.length; i++) {
  if (obj[arr[i]] === arr[i]) {
    arr[i] = arr[arr.length - 1];
    arr.length--;
    i--;
    continue
  } else {
    obj[arr[i]] = arr[i]
    newArr.push(arr[i])
  }
}
==============封裝函式方式=======================================
  function uniue(arr) {
  let obj = {};
  let newArr = [];
  for (let i = 0; i < arr.length; i++) {
    if (obj[arr[i]] === arr[i]) {
      //如果已經存在 將陣列的最後一位移到當前位置
      arr[i] = arr[arr.length - 1]; 
      arr.length--; //然後 刪除最後一項
      i--;  //並將對應得陣列長度-1
      continue
    } 
    newArr.push( arr[i])
    obj[arr[i]] = arr[i];
  }
  return newArr;
}
let arr1 = [1, 2, 2, 1, 3, 5, 6, 25];
;
console.log(uniue(arr1))

6.ES6 Set去重

 let arr1 = [1, 2, 2, 1, 3, 5, 6];
 let arr = [...new Set(arr1)];
 console.log(arr)  // [1, 2, 3, 5, 6]

7.在原型上封裝去重