遇到复杂数组去重问题
之前一直使用的
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);
又一问题,求数组中相同id的价格之和
let a = [{id:1,price:1},{id:2,price:2},{id:3,price:3},{id:4,price:4},{id:1,price:1},{id:2,price:2},{id:1,price:1},{id:1,price:1},{id:2,price:2},{id:3,price:3}] console.log(this.sumRepeat(a))
sumRepeat(arr){ let replicateArr = JSON.parse(JSON.stringify(arr)) let equalList = [] for(var i=0; i<replicateArr.length; i++){ for(var j=i+1; j<replicateArr.length; j++){ if(replicateArr[i].id==replicateArr[j].id){ equalList.push(replicateArr[j].id) //第一个等同于第二个,splice方法删除第二个 replicateArr.splice(j,1); j--; } } } equalList = [...new Set(equalList)] let numList = [] for(var i=0; i<equalList.length; i++){ let num = 0 for(var j=0; j<arr.length; j++){ if(equalList[i] == arr[j].id){ num += arr[j].price } } numList.push({ id:equalList[i], price:num }) } return numList; },
最后输出结果