1

I have an array like this:

var  data = [
    { catNumber: 'EK-21200', quantity: 5},
    { catNumber: 'EK-00341', quantity: 5},
    { catNumber: 'EK-21200', quantity: 5},
    { catNumber: 'EK-21200', quantity: 5},
    { catNumber: 'EK-00341', quantity: 5}
];

I want the result to be summing all the quantities of same catNumber.

var  data = [
    { catNumber: 'EK-21200', quantity: 15},
    { catNumber: 'EK-00341', quantity: 10}
];
trincot
  • 317,000
  • 35
  • 244
  • 286
Sharath S
  • 37
  • 7

1 Answers1

3

You could use this ES6 code:

var  data = [
    { catNumber: 'EK-21200', quantity: 5},
    { catNumber: 'EK-00341', quantity: 5},
    { catNumber: 'EK-21200', quantity: 5},
    { catNumber: 'EK-21200', quantity: 5},
    { catNumber: 'EK-00341', quantity: 5}
];

data = Array.from(data.reduce( (acc, {catNumber, quantity}) => 
    acc.set(catNumber, (acc.get(catNumber) || 0) + quantity),
    new Map()
), ([catNumber, quantity]) => ({catNumber, quantity}) );

console.log(data);

Or, in ES5 version:

var  data = [
    { catNumber: 'EK-21200', quantity: 5},
    { catNumber: 'EK-00341', quantity: 5},
    { catNumber: 'EK-21200', quantity: 5},
    { catNumber: 'EK-21200', quantity: 5},
    { catNumber: 'EK-00341', quantity: 5}
];

var acc = data.reduce( function(acc, obj) {
    acc[obj.catNumber] = (acc[obj.catNumber] || 0) + obj.quantity;
    return acc;
}, {});
data = Object.keys(acc).map(function(key) {
    return { catNumber: key, quantity: acc[key] };
});

console.log(data);

And finally, here is a version that does not use Array iteration methods such as reduce or map, but uses for loops instead:

var  data = [
    { catNumber: 'EK-21200', quantity: 5},
    { catNumber: 'EK-00341', quantity: 5},
    { catNumber: 'EK-21200', quantity: 5},
    { catNumber: 'EK-21200', quantity: 5},
    { catNumber: 'EK-00341', quantity: 5}
];

var acc = {};
for (var i = 0; i < data.length; i++) {
    var obj = data[i];
    if (!acc[obj.catNumber]) acc[obj.catNumber] = 0;
    acc[obj.catNumber] += obj.quantity;
}
data = [];
for (var key in acc) {
    data.push({ catNumber: key, quantity: acc[key] });
}

console.log(data);
trincot
  • 317,000
  • 35
  • 244
  • 286