Search code examples
javascriptarraysgroupingjavascript-objects

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


I have an array of objects like below for example.

{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}

I want to group them up and adding up all the values in it. For example, the final would be like this:

{name: "Mc Donald", quantity: 8, maleCount: 1, femaleCount: 1}
{name: "KFC", quantity: 54, maleCount: 3, femaleCount: 3}

How can I achieve this in JavaScript?

I have tried to find some solution online but it is not the one I wanted. For example this solution


Solution

  • You can use array reduce:

    var arr = [
        {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}
    ];
    
    var finalArr = arr.reduce((m, o) => {
        var found = m.find(p => p.name === o.name);
        if (found) {
            found.quantity += o.quantity;
            found.maleCount += o.maleCount;
            found.femaleCount += o.femaleCount;
        } else {
            m.push(o);
        }
        return m;
    }, []);
    
    console.log(finalArr);