【原】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項其實是一樣的,最初在谷歌找了幾個方法最終都不太滿意,比如會改變陣列中物件原來的排序、陣列去重失敗等,後來經過多次嘗試和實踐,得出以下最簡單的方法:
- 利用物件的鍵名無法重複的特點 ,我們可以新建一個臨時物件來儲存原陣列中的物件子集的值,比如我的專案中mch_id是唯一的ID,然後設定的它為臨時物件的鍵名,值為true即可,保證它的唯一性
- 通過判斷物件的鍵名是唯一時,把對應的陣列值新增到一個空陣列中,最終得到一個去重後的陣列物件
- 此方法不會改變陣列物件原有的排序
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; }
提前祝大家勞動節快樂