Tengo una variedad de objetos, necesito arr con product , calorie y aplicar (agrupación y suma) en los parámetros restantes.
Y luego requiere datos en un solo objeto. Probé el siguiente código, funciona bien pero dividí el código en 3 partes. ¿Podría tener un código mejor que este o está bien?
var arr = [{ "product": "Jam", "calorie": 2000, "A": 300, "B": 500, "type": "Daily" }, { "product": "Sugar", "calorie": 1000, "A": 100, "B": 200, "type": "Daily" } ] var a1 = {} var a2 = {} //Step-1 Pivot for (let i = 0; i < arr.length; i++) { a1[arr[i]['product']] = arr[i]['calorie']; } //Step-2 Group and sum a2 = groupAndSum(arr, ['type'], ['A', 'B'])[0]; //Step-3 merging. console.log({ ...a1, ...a2 }) //General grouping and summing function that accepts an //@Array:Array of objects //@groupKeys: An array of keys to group by, //@sumKeys - An array of keys to sum. function groupAndSum(arr, groupKeys, sumKeys) { return Object.values( arr.reduce((acc, curr) => { const group = groupKeys.map(k => curr[k]).join('-'); acc[group] = acc[group] || Object.fromEntries(groupKeys.map(k => [k, curr[k]]).concat(sumKeys.map(k => [k, 0]))); sumKeys.forEach(k => acc[group][k] += curr[k]); return acc; }, {}) ); }Aquí una sola función que toma 3 params:
const func = (arr, pivot_vals, sum_vals) => { return arr.reduce((a, v) => { pivot_vals.forEach((pivot) => { a[v[pivot[0]]] = v[pivot[1]]; }); sum_vals.forEach((key) => { if (!a[key]) a[key] = 0; a[key] += v[key]; }); return a; },{}); }; arr que contiene los datos
matriz sum_vals con todos los accesorios que desea que se sumen
matriz anidada pivot_vals con los accesorios que deben vincularse
No estaba seguro de qué hacer con el type , ya que es una cadena que no se puede sumar. ¿Querías contar la cantidad de tipos?
let arr = [ { product: "Jam", calorie: 2000, A: 300, B: 500, type: "Daily", }, { product: "Sugar", calorie: 1000, A: 100, B: 200, type: "Daily", }, ]; let sum_vals = ["A","B"] let pivot_vals = [["product", "calorie"]]; const func = (arr, pivot_vals, sum_vals) => { return arr.reduce((a, v) => { pivot_vals.forEach((pivot) => { a[v[pivot[0]]] = v[pivot[1]]; }); sum_vals.forEach((key) => { if (!a[key]) a[key] = 0; a[key] += v[key]; }); return a; },{}); }; console.log(func(arr, pivot_vals, sum_vals));