遇到復雜數組去重問題
之前一直使用的
this.list = [...new Set(this.list)]
不管用了,具體原因,待解。
發現一個很好用的方法
一,適用於對整個復雜對象進行對比去重
// 復雜數組去重 removeDuplicates(arr){ let obj = {} return arr.filter((item, index) => { // 防止key重復 let newItem = item + JSON.stringify(item) return obj.hasOwnProperty(newItem) ? false : obj[newItem] = true }) },
知識點:
hasOwnProperty:判斷 obj中有無newItem這個屬性。
返回值為布爾值。
只能找到自身屬性,繼承屬性為false
需要注意一點,js並沒有保護hasOwnProperty。意味着如果提前把hasOwnProperty值設為false或true
得到的結論並不准確。如果擔心這種情況,1.可以直接使用原型鏈上真正的 hasOwnProperty 方法
2.使用另一個對象的`hasOwnProperty` 並且call
({}).hasOwnProperty.call(foo, 'bar'); // true
3.也可以使用 Object 原型上的 hasOwnProperty 屬性
Object.prototype.hasOwnProperty.call(foo, 'bar'); // true
let arr = [1,2,3,4,4,1]
let newArr = arr.reduce((pre,cur)=>{
if(!pre.includes(cur)){
return pre.concat(cur)
}else{
return pre
}
},[])
console.log(newArr);
此方法不適於復雜對象,includes不能適用對象
二,適用於對對象中某一項進行對比去重(比如 id)
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--; } } } return arr; }
let person = [ {id: 0, name: "小明"}, {id: 1, name: "小張"}, {id: 2, name: "小李"}, {id: 3, name: "小孫"}, {id: 1, name: "小周"}, {id: 2, name: "小陳"}, ]; let obj = {}; let peon = person.reduce((cur,next) => { obj[next.id] ? "" : obj[next.id] = true && cur.push(next); return cur; },[]) //設置cur默認類型為數組,並且初始值為空的數組 console.log(peon);