Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

85
Views
How to group objects by some property while summing another

I try many ways to solve this. I can remove duplicate values. but the problem is updating total_product value. How can I do this? Give me some hints.

This is my Main Array :

 const colors = [
    { "name": "Black", "total_product": 1 },
    { "name": "Black", "total_product": 1 },
    { "name": "White", "total_product": 1 },
    { "name": "White", "total_product": 1 },
    { "name": "White", "total_product": 1 },
    { "name": "White", "total_product": 1 },    
]

I Want Like This :

 const colors = [
    { "name": "Black", "total_product": 2 },
    { "name": "White", "total_product": 4 }         
]
about 4 years ago · Juan Pablo Isaza
3 answers
Answer question

0

You can use new Map() or simple object to store the count of same objects:

const colors = [
  { "name": "Black", "total_product": 1 },
  { "name": "Black", "total_product": 1 },
  { "name": "White", "total_product": 1 },
  { "name": "White", "total_product": 1 },
  { "name": "White", "total_product": 1 },
  { "name": "White", "total_product": 1 },    
];

const colorsMap = new Map();

colors.forEach(color => {
  
  if (colorsMap.has(color.name)) {
    colorsMap.set(color.name, colorsMap.get(color.name) + 1);
    return;
  }
  
  colorsMap.set(color.name, 1);
});

const groupedColors = [];

colorsMap.forEach((value, key) => {
  groupedColors.push({
    name: key,
    total_product: value
  });
})

console.log(groupedColors);

about 4 years ago · Juan Pablo Isaza Report

0

It's a good case for reduce which "boils down" an array to an accumulator value. Here, reduce (doc) can be used to create objects that count occurrences of each name...

const colors = [
    { "name": "Black", "total_product": 1 },
    { "name": "Black", "total_product": 1 },
    { "name": "White", "total_product": 1 },
    { "name": "White", "total_product": 1 },
    { "name": "White", "total_product": 1 },
    { "name": "White", "total_product": 1 } 
];

const counts = colors.reduce((acc, obj) => {
  if (!acc[obj.name]) acc[obj.name] = { name: obj.name, total_product: 0 };
  acc[obj.name].total_product++;
  return acc;
}, {});
const result = Object.values(counts);
console.log(result);

The intermediate value counts produced by reduce looks like this...

{
  "Black": {
    "name": "Black",
    "total_product": 2 // <- incremented each time we found a "Black"
  },
  "White": {
    "name": "White",
    "total_product": 4 // <- incremented each time we found a "White"
  }
}

Object.values(), like the name implies, makes an array of the values.

about 4 years ago · Juan Pablo Isaza Report

0

It makes no sense to return an Array since you already squashed the array to unique names and their respective values, simply reduce to Object:

const colors = [
  {name:"Black", total_product:1},
  {name:"Black", total_product:1},
  {name:"White", total_product:1},
  {name:"White", total_product:1},
  {name:"White", total_product:1},
  {name:"White", total_product:1},    
];

const sumColors = colors.reduce((ob, item) => {
  ob[item.name] ??= 0
  ob[item.name] += item.total_product;
  return ob;
}, {});

console.log(sumColors); // {"Black": 2, "White": 4}

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!