How to group or merge this array of objects in javascript?

前端 未结 8 872
悲&欢浪女
悲&欢浪女 2020-12-18 23:22

I have an array of objects like below for example.

{name: \"Mc Donald\", quantity: 4, maleCount: 1, femaleCount: 0}
{name: \"KFC\", quantity: 9, maleCou         


        
8条回答
  •  刺人心
    刺人心 (楼主)
    2020-12-18 23:58

    My solution based on reduce:

    let data = [
      {name: "Mc Donald", quantity: 4, maleCount: 1, femaleCount: 0},
      {name: "KFC", quantity: 9, maleCount: 1, femaleCount: 0},
      {name: "KFC", quantity: 9, maleCount: 1, femaleCount: 0},
      {name: "Mc Donald", quantity: 4, maleCount: 0, femaleCount: 1},
      {name: "KFC", quantity: 9, maleCount: 0, femaleCount: 1},
      {name: "KFC", quantity: 9, maleCount: 1, femaleCount: 0},
      {name: "KFC", quantity: 9, maleCount: 0, femaleCount: 1},
      {name: "KFC", quantity: 9, maleCount: 0, femaleCount: 1}
    ];
    
    // We will only keep an array of values of the merged object
    let result = Object.values(
      // Merge data to name indexed objects
      data.reduce((p,c) => {
        // Ensure key (name) exists
        if (!p[c.name]) {
           // If first occurence, duplicate object (to avoid modification of original array)
           p[c.name] = Object.assign({}, c);
        } else {
           // If key (name) already exists, sum up relevant attributes
           p[c.name].quantity += c.quantity;
           p[c.name].maleCount += c.maleCount;
           p[c.name].femaleCount += c.femaleCount;
        }
        // return updated object
        return p;
      }, {})
    );
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    hope this will help

提交回复
热议问题