Tengo la siguiente matriz de objetos.
const mi_array = [{ agrupacion: "Total país", col2015: '81.8', col2016: '86.4', col2017: '67.3', col2018: '70.8', col2019: '67.6' },{ agrupacion: "otra cosa", col2015: '90.8', col2016: '67.4', col2017: '39.3', col2018: '50.8', col2019: '95.6' }];Necesito transformar esto en algo como esto:
const new_array = [{ name: "Total país", data: [81.8, 86.4, 67.3, 70.8, 67.6] }, { name: "otra cosa", data: [90.8, 67.4, 39.3, 50.8, 95.6] }];Intenté esto, pero dado que los valores en las claves col2015 a 2019 son todas cadenas, no funciona según lo previsto
const result = mi_array.map(e => ({ name: e.agrupacion, data: Object.values(e).filter(e => typeof e == 'number') })) console.log(result)producción:
[{ data: [], name: "Total país" }, { data: [], name: "otra cosa" }]Sé que funcionará si puedo transformar esos valores en números de alguna manera, así que traté de lograrlo con esto:
for(let key of Object.keys(mi_array)) mi_array[key] = +mi_array[key] console.log(mi_array);sin embargo, mi salida es:
[NaN, NaN]otro intento:
var result = Object.keys(mi_array).map(function(key) { return [Number(key), mi_array[key]]; }); console.log(result);otra salida fallida:
[[0, { agrupacion: "Total país", col2015: "81.8", col2016: "86.4", col2017: "67.3", col2018: "70.8", col2019: "67.6" }], [1, { agrupacion: "otra cosa", col2015: "90.8", col2016: "67.4", col2017: "39.3", col2018: "50.8", col2019: "95.6" }]]¿Hay una manera eficiente de hacer esto?
Podría desestructurar name y tomar del resto solo los valores como data , después de mapear con Number .
Este enfoque toma el orden original del objeto.
const mi_array = [{ agrupacion: "Total país", col2015: '81.8', col2016: '86.4', col2017: '67.3', col2018: '70.8', col2019: '67.6' }, { agrupacion: "otra cosa", col2015: '90.8', col2016: '67.4', col2017: '39.3', col2018: '50.8', col2019: '95.6' }], result = mi_array.map(({ agrupacion: name, ...o }) => ({ name, data: Object.values(o).map(Number) })); console.log(result); .as-console-wrapper { max-height: 100% !important; top: 0; }const new_array = []; for(let i = 0; i < mi_array.length; ++i) { const new_obj = {"name":"", "data":[]}; for(const key in mi_array[i]) { const num = Number(mi_array[i][key]); if(isNaN(num)) { new_obj.name = mi_array[i][key]; } else { new_obj.data.push(num); } } new_array.push(new_obj); }Podrías usarlo.
Primero, mapee la matriz y tome las propiedades agrupacion y rest props for map in data y convierta a Number .
const newArr = mi_array.map(({agrupacion, ...props})=> ({ name:agrupacion, data: [...Object.values(props).map(value => Number(value))] }))