Cómo convertir una matriz de objetos de gran formato en un formato largo
Matriz de entrada:
[ { series: "opening_balance", "Oct 2021": 12713238.3, "Nov 2021": 27713238.3, "Dec 2021": 22713238.3, }, { series: "inflow", "Oct 2021": 7, "Nov 2021": 40000000, "Dec 2021": 50000000, } ];Matriz de salida:
[ { year_month: "Oct 2021", opening_balance: 5, inflow: 100 }, { year_month: "Nov 2021", opening_balance: 10, inflow: 200 }, { year_month: "Dec 2021", opening_balance: 15, inflow: 150 }, ];El resultado también fueron los datos originales provenientes de la llamada a la API. Se transformó en un formato ancho para usar en React-table, y funcionó.
Sin embargo, las celdas de la tabla ahora se pueden editar y necesita actualizar los datos de origen en otro componente; y por lo tanto, necesita obtener el formato original.
Intenté varias formas pero no pude tener éxito. A continuación se muestra el código que no funciona.
let data = [ { series: "opening_balance", "Oct 2021": 5, "Nov 2021": 10, "Dec 2021": 15, }, { series: "inflow", "Oct 2021": 100, "Nov 2021": 200, "Dec 2021": 150, }, ]; let results = data.map((row) => { let keys = Object.keys(row); let x = keys.map((key) => { return { year_month: key, value: row[key] }; }); return [...x]; }); console.log("results:", results);produce
results: [ [ { year_month: 'series', value: 'opening_balance' }, { year_month: 'Oct 2021', value: 5 }, { year_month: 'Nov 2021', value: 10 }, { year_month: 'Dec 2021', value: 15 } ], [ { year_month: 'series', value: 'inflow' }, { year_month: 'Oct 2021', value: 100 }, { year_month: 'Nov 2021', value: 200 }, { year_month: 'Dec 2021', value: 150 } ] ]¿Alguien podría ayudar a transformar los datos?
Mi sugerencia para usted sería hacer que la transformación en el backend pueda estar en la capa de la base de datos o en la capa de la API.
Aunque la transformación se puede hacer así de la manera difícil: https://stackblitz.com/edit/node-8u47y6?file=index.js
const arr = [ { series: 'opening_balance', 'Oct 2021': 12713238.3, 'Nov 2021': 27713238.3, 'Dec 2021': 22713238.3, }, { series: 'inflow', 'Oct 2021': 7, 'Nov 2021': 40000000, 'Dec 2021': 50000000, }, { series: 'customXYZ', 'Oct 2021': 1, 'Nov 2021': 2, 'Dec 2021': 3, }, ]; const hashMap = {}; // Creating the hashmap for each year_month arr.forEach((obj) => { const series = obj.series; Object.entries(obj).forEach(([key, value]) => { if (key !== 'series') { if (!hashMap[key]) { hashMap[key] = {}; } hashMap[key][series] = value; } }); }); // transforming the same to array like values const result = Object.entries(hashMap).map(([key, value]) => ({ year_month: key, ...value, })); console.log(result);