Así que tengo una matriz existente con tres objetos:
[ { date: 3/12/2022, oService: 10} { date: 3/13/2022, oService: 12, aService: 1} { date: 3/13/2022, oService: 1 }]Según la fecha, me gustaría obtener algo parecido a lo siguiente:
[ {date: 3/12/2022, oService: 10} {date: 3/13/2022, oService: 13, aService: 1}]además, podría tener hasta 10 servicios, por lo que no puedo reducir por prev.oService. Tendré una variedad de servicios que se parece a:
const Services = [aService, bService, cService, oService, yService]
Creo que es mejor pensar en el problema como 2 pasos diferentes:
groupBy que debería poder buscar en StackOverflow o tomar prestado de una biblioteca existente. La operación de merge es un poco más personalizada que la operación groupBy . Puedes implementarlo de muchas maneras. Yo propondría a:
merge para tratar con solo 2 objetosmerge , recorra todas las claves únicas en esos objetos y súmelos (excluyendo la clave de date )merge a un grupo de fechas, use reduce . Tenga en cuenta que es seguro no proporcionar un argumento semilla aquí, porque tiene la garantía de no tener grupos vacíos. // Merge two date-service entries in to one const merge = (a, b) => { const merged = Object.assign({}, a); Object.keys(b).forEach(k => { if (k !== "date") merged[k] = (merged[k] || 0) + b[k]; }); return merged; }; const input = [ { date: "3/12/2022", oService: 10}, { date: "3/13/2022", oService: 12, aService: 1}, { date: "3/13/2022", oService: 1 }]; // Create groups that have a matching date const byDate = groupByProp("date", input); // Reduce each group to a single item by merging const all = Object.values(byDate).map(xs => xs.reduce(merge)); console.log(all); // A basic `groupBy` implementation function groupByProp(prop, xs) { return xs.reduce( (groups, x) => { const k = x[prop]; if (!groups[k]) groups[k] = [x]; else groups[k].push(x); return groups; }, {} ); }