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

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

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

最經常使用的能夠用for循環套for循環,再用splice刪除重複的數組:spa

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循環來去重,以下面的數組對象:code

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'
    }
]

經過觀察,咱們能夠發現該數組中的第一、三、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數組方法reduceblog

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;
}

 提早祝你們勞動節快樂排序

相關文章
相關標籤/搜索