Tengo esta matriz de objetos (datos). Estos son los primeros en indexar:
0: Object granularity_time: "total" granularity_geo: "nation" location_code: "norge" border: "2020" age: "90+" sex: "female" year: "1900" week: "1" yrwk: "1900-01" season: "1899/1900" x: "24" date: "1900-01-01" n: "219" date_of_publishing: "2022-01-12" tag_outcome: "death" 1: Object granularity_time: "total" granularity_geo: "nation" location_code: "norge" border: "2020" age: "90+" sex: "male" year: "1900" week: "1" yrwk: "1900-01" season: "1899/1900" x: "24" date: "1900-01-01" n: "127" date_of_publishing: "2022-01-12" tag_outcome: "death"Sus estadísticas donde hombres y mujeres en la misma edad tienen su propio objeto. El índice 0 es para mujeres mayores de 90 años, el índice 1 para hombres mayores de 90 años. El índice 2 es para mujeres mayores de 80 años, el índice 3 es para hombres mayores de 80 años, etc.
Quiero formatear los datos para que cada índice contenga dos objetos, para hombres y mujeres de la misma edad.
Algo como esto:
const newData = [ { woman: data[0], men: data[1] }, { woman: data[2], men: data[3] }, { woman: data[4], men: data[5] }, { woman: data[6], men: data[7] }, { woman: data[8], men: data[9] }, { woman: data[10], men: data[11] }, { woman: data[12], men: data[13] } ];Intenté hacer una función que repita los datos, pero cada entrada termina sin definirse:
const formatData = (data) => { const newData = []; data?.map((item, i) => { i % 2 === 0 ? newData.push({ woman: item[i], men: item[i++] }) : null; }); return newData; };¿Que me estoy perdiendo aqui?
Esto realmente funciona, pero no estoy seguro de si es la mejor práctica, ya que solo estoy usando el mapa para obtener i..
const formatData = (data) => { const newData = []; data?.map((item, i) => { i % 2 === 0 ? newData.push({ woman: data[i], men: data[i + 1] }) : null; }); return newData;};
Puede usar Array.from() y Array.map() para crear la salida deseada a partir de su matriz de datos original.
La longitud de la nueva matriz será data.length / 2, y cada elemento alternativo se asignará a la propiedad de hombre o mujer de cada elemento en la matriz de salida.
const template = { year: 1900, location_code: 'norge' }; // Some array of input data... const data = Array.from({length: 14}, (v,k) => ({...template, id: k, gender: ( k % 2 === 0 ? 'female':'male' )})); const result = Array.from( { length: data.length / 2 }, (v, idx) => { return { women: data[2*idx], men: data[2*idx + 1], }; }) console.log(result) .as-console-wrapper { max-height: 100% !important; top: 0; }Dado que la salida es la mitad de la entrada, en realidad es más una reducción()...
const data = [{ gender: "m", name: "sam" }, { gender: "f", name: "sally" }, { gender: "m", name: "allen" }, { gender: "f", name: "abby" }, { gender: "m", name: "jim" }, { gender: "f", name: "jill" }]; const newData = data.reduce((acc, obj, i) => { i % 2 ? acc[acc.length-1].woman = obj : acc.push({ man: obj }) return acc; }, []); console.log(newData)