如何将相同属性的数组对象合并并统计个数?

示例数据结构:

 let data = [{
    id: '1',
    goodsName: 'test',
    price: 22
  },
  {
    id: '2',
    goodsName: 'test',
    price: 22
  },
  {
    id: '2',
    goodsName: 'test',
    price: 22
  },
  {
    id: '3',
    goodsName: 'test',
    price: 22
  },
  {
    id: '3',
    goodsName: 'test',
    price: 22
  },
  {
    id: '3',
    goodsName: 'test',
    price: 22
  },
  {
    id: '3',
    goodsName: 'test',
    price: 22
  },
  {
    id: '4',
    goodsName: 'test',
    price: 22
  }
]

问题:如何将数据处理为下列数据结构?

let data = [{
    id: '1',
    goodsName: 'test',
    price: 22,
    count:1
  },
  {
    id: '2',
    goodsName: 'test',
    price: 22,
    count:2
  },
  {
    id: '3',
    goodsName: 'test',
    price: 22,
    count:4
  },
  {
    id: '4',
    goodsName: 'test',
    price: 22,
    count:1
  }
]
已解决 悬赏分:10 - 解决时间 2021-11-28 05:04
反对 0举报 0 收藏 0

回答4

最佳
  • @
    data.reduce((obj, item) => {  
      let find = obj.find(i => i.id === item.id)  
      let _d = {  
        ...item,  
        count: 1  
      }  
      find ? find.count++ : obj.push(_d)  
      return obj  
    }, [])
    支持 0 反对 0 举报
    2021-11-27 07:13
  • @
      let dataArr = [你的那个数组]
      let result = {};
      for (let i = 0, len = dataArr.length; i < len; i++) {
        let data = dataArr[i];
        if (result[data.id]) {
          result[data.id]["count"] += 1;
        } else {
          result[data.id] = { ...data, count: 1 };
        }
      }
      let resultArr = [];
      for (const key in result) {
        resultArr.push(result[key]);
      }
      
    支持 0 反对 0 举报
    2021-11-27 07:33
  • @
    Object.entries(data.reduce((a,c)=>{
      if(!a[c.id]){
        a[c.id] = {
            ...c,
            count:1
        }
      }else{
        a[c.id].count += 1;
      }
      return a;
    },{})).map(entry=>entry[1])
    支持 0 反对 0 举报
    2021-11-27 08:47
  • @
    // 1th Method
    var interimArray = [];   // 用来存放去重后的id的
    var resultArray = [];   // 最终的期望结果
    
    var count = 1;
    for (var i in data) {
      if (interimArray.indexOf(data[i].id) > -1) {
        console.log(`${data[i].id}已经存在,计数加1`, `count为${count}`);
        for (var j in resultArray) {
          if (resultArray[j].id === data[i].id) {
            count++;
            resultArray[j].count = count;
          }
        }
      } else {
        count = 1;
        console.log(`${data[i].id}不存在,数组加入${data[i].id}`, `count重置为${count}`);
        interimArray.push(data[i].id);
        data[i].count = count;
        resultArray.push(data[i]);
      }
    }
    
    console.log(JSON.stringify(resultArray, null, 2));
    支持 0 反对 0 举报
    2021-11-27 09:43