Tengo una función escrita así:
type ChartData = { x?: number[], y?: number[], z?: number[], }; const data = [{ x: 1, y: 2, z: 3 }, { x: 4, y: 7, z: 10 }]; const formattedData = data.reduce((acc, el) => { Object.entries(el!).forEach(([k, v]) => { acc = { ...acc, [k]: [...(acc[k as keyof ChartData] || []), v] }; }); return acc; }, {} as ChartData);
Este código hace lo que quiero, pero recibo un error eslint: no-param-reassign
.
Sé que podría deshabilitar la regla, pero me preguntaba si hay una mejor manera de escribir esta devolución de llamada reducida para no reasignar acc
.
Esta advertencia de 'sin reasignación de parámetros' significa que ha modificado los parámetros de la función dentro de la función. Así que aquí quizás haya una solución para esta advertencia.
type ChartData = { x?: number[], y?: number[], z?: number[], }; const data = [{ x: 1, y: 2, z: 3 }, { x: 4, y: 7, z: 10 }]; const formattedData = data.reduce((acc, el) => { let newAcc = { ...acc }; Object.entries(el!).forEach(([k, v]) => { newAcc = { ...newAcc , [k]: [...(newAcc [k as keyof ChartData] || []), v] }; }); return newAcc ; }, {} as ChartData);
Puede asignar a acc[k]
directamente:
const data = [{ x: 1, y: 2, z: 3 }, { x: 4, y: 7, z: 10 }]; const formattedData = data.reduce((acc, el) => { Object.entries(el).forEach(([k, v]) => { acc[k] = (acc[k] || []).concat(v); }); return acc; }, {}); console.log(formattedData);
Más código pero también más eficiente (menos asignaciones y copias):
const data = [{ x: 1, y: 2, z: 3 }, { x: 4, y: 7, z: 10 }]; const formattedData = data.reduce((acc, el) => { Object.entries(el).forEach(([k, v]) => { if (!acc[k]) { acc[k] = []; } acc[k].push(v); }); return acc; }, {}); console.log(formattedData);