Tengo los siguientes datos entrantes (objetos reducidos para una comprensión más fácil). Mis propiedades pueden incluir cientos a miles de propiedades.
teams = { teams: ['Lakers', 'Clippers', 'Bucks', 'Suns'], states: ['California', 'California', 'Wisconsin', 'Arizona'] }Tenga en cuenta que las propiedades siempre contendrán el mismo número de elementos para cada una.
Me gustaría convertirlo en una lista de matriz de objetos:
teamsList = [ { teams: 'Lakers', states: 'California' }, { teams: 'Clippers', states: 'California' }, { teams: 'Bucks', states: 'Wisconsin' }, { teams: 'Suns', states: 'Arizona' } ]Esto es lo que inicialmente tenía en mente y probé:
const parseData = (obj) => { const teams = obj.teams; const states = obj.states; let newArrayList = []; teams.forEach((item, index) => { const teamData = { teams: item, states: states[index] } newArrayList.push(teamData); }) return newArrayList; }Me pregunto si hay una forma más óptima de hacer esto.
Olvidé agregar que estoy buscando formas para que cada propiedad de objeto en la nueva lista de matrices también sea dinámica, como determinar las claves para el nuevo objeto sin escribir cada propiedad específica:
teams.forEach((item, index) => { const teamData = { teams: item, states: states[index], n: n[index] } newArrayList.push(teamData); })Donde n corresponde a cualquier número de posibles claves de objeto.
Gracias.
Asigne una de las matrices y use el índice para encontrar el valor coincidente en la otra matriz y devuelva un objeto.
const teams = { teams: ['Lakers', 'Clippers', 'Bucks', 'Suns'], states: ['California', 'California', 'Wisconsin', 'Arizona'] }; const teamList = teams.teams.map((t, i) => ({ teams: t, states: teams.states[i] })); console.log(teamList);Si tiene muchas propiedades, itere sobre las entradas.
const teams = { teams: ['Lakers', 'Clippers', 'Bucks', 'Suns'], states: ['California', 'California', 'Wisconsin', 'Arizona'] }; const entries = Object.entries(teams); const [key, arr] = entries.shift(); const teamList = arr.map((val, i) => Object.fromEntries( [[key, val]].concat( entries.map(entry => [entry[0], entry[1][i]]) ) )); console.log(teamList);Esta solución funciona determinando primero la longitud de la matriz más larga y luego creando nuevos objetos dinámicamente en función de las claves disponibles en sus datos:
const data = { teams: ['Lakers', 'Clippers', 'Bucks', 'Suns'], states: ['California', 'California', 'Wisconsin', 'Arizona'] }; const result = [ ...Array(Object.values(data).reduce((a, {length}) => Math.max(a, length), 0)) ].map((_, i) => Object.keys(data).reduce((a, k) => ({...a, [k]: data[k][i]}), {})); console.log(result);Use Array.map() que iterará cada elemento y devolverá la matriz final del objeto.
teams = { teams: ['Lakers', 'Clippers', 'Bucks', 'Suns'], states: ['California', 'California', 'Wisconsin', 'Arizona'] }; const parseData = (obj) => { const states = teams.states; return obj.teams.map((teams, index) => ({ teams, states: states[index] })); } console.log(parseData(teams));