Intento muchas maneras de resolver esto. Puedo eliminar valores duplicados. pero el problema es actualizar el valor total_product. ¿Cómo puedo hacer esto? Dame algunos consejos.
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 colors = [ { "name": "Black", "total_product": 2 }, { "name": "White", "total_product": 4 } ]Puede usar el new Map() o un objeto simple para almacenar el recuento de los mismos objetos:
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);Es un buen caso para reduce lo que "reduce" una matriz a un valor acumulador. Aquí, reduce ( doc ) se puede usar para crear objetos que cuenten las ocurrencias de cada nombre...
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); El valor intermedio counts producido por reducir se ve así...
{ "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() , como su nombre lo indica, crea una matriz de valores.
No tiene sentido devolver una matriz ya que ya aplastó la matriz en nombres únicos y sus respectivos valores, simplemente redúzcala a Objeto:
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}