简单的数组去重是比较简单的,方法也特别多,如给下面的数组去重:数组
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项实际上是同样的,最初在谷歌找了几个方法最终都不太满意,好比会改变数组中对象原来的排序、数组去重失败等,后来通过屡次尝试和实践,得出如下最简单的方法:对象
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; }
提早祝你们劳动节快乐排序