【原】js數組對象去重最簡單的方法


簡單的數組去重是比較簡單的,方法也特別多,如給下面的數組去重:

let arr = [1,2,2,4,9,6,7,5,2,3,5,6,5]

最常用的可以用for循環套for循環,再用splice刪除重復的數組:

let arrUnique = function (arr){            
        for(let i=0; i<arr.length; i++){
            for(let j=i+1; j<arr.length; j++){
                if(arr[i]==arr[j]){ //第一個等同於第二個,splice方法刪除第二個
                    arr.splice(j,1);
                    j--;
                }
            }
        }
return arr;
}

然而數組的子集為對象時,一般不使用多個for循環來去重,如下面的數組對象:

let arr = [
    {
        mch_id:'ghx1',
        status: 1,
        type: 2
    },
    {
        mch_id:'awx2',
        status: 2,
        type: 3
    },
    {
        mch_id:'ghx1',
        status: 1,
        type: 2
    },
    {
        status: 1,
        type: 2,
        mch_id:'ghx1'
    }
]

通過觀察,我們可以發現該數組中的第1、3、4項其實是一樣的,最初在谷歌找了幾個方法最終都不太滿意,比如會改變數組中對象原來的排序、數組去重失敗等,后來經過多次嘗試和實踐,得出以下最簡單的方法:

  1. 利用對象的鍵名無法重復的特點,我們可以新建一個臨時對象來存儲原數組中的對象子集的值,比如我的項目中mch_id是唯一的ID,然后設置的它為臨時對象的鍵名,值為true即可,保證它的唯一性
  2. 通過判斷對象的鍵名是唯一時,把對應的數組值添加到一個空數組中,最終得到一個去重后的數組對象
  3. 此方法不會改變數組對象原有的排序
let arrUnique = function(arr){
    let result = {};
    let finalResult=[];
    for(let i=0;i<arr.length;i++){
        //利用對象的鍵名無法重復的特點,cpmch_id是唯一區別的屬性值
        result[arr[i].mch_id] ? '' : result[arr[i].mch_id] = true && finalResult.push(arr[i]);
    }
    return finalResult;
}

或者利用ES5數組方法reduce

let arrUnique = function(arr){
    let ojb = {};
    arr = arr.reduce(function(prevArr, currentItem) {
        //利用對象的鍵名無法重復的特點,mch_id是唯一區別的屬性值
        ojb[currentItem.mch_id] ? '' : ojb[currentItem.mch_id] = true && prevArr.push(currentItem);
        return prevArr
    }, [])
    return arr;
}

 提前祝大家勞動節快樂


免責聲明!

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



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