dandanyajin
今天更新博客了吗?

遇到复杂数组去重问题

之前一直使用的

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

最后输出结果

 

 


 
posted on 2020-11-16 14:58  dandanyajin  阅读(1473)  评论(0编辑  收藏  举报