Estoy tratando de transformar una matriz de objectst con claves: name y winRatio en otra matriz de objetos con una clave de cada nombre y valor únicos de un elemento en la matriz winRatio.
El propósito de este problema es transformar los datos entrantes y reformatearlos en una solución de realización de gráficos (Recharts, si está interesado)
Aporte
const data = [ { name: 'Tyler', winRatio: [1, 0.5, 0.6666666666666666], }, { name: 'Lizzie', winRatio: [0, 0.5, 0.3333333333333333], }, ];Producción
const formatted = [ { index: 0, Tyler: 1, Lizzie: 0, }, { index: 1, Tyler: 0.5, Lizzie: 0.5, }, { index: 2, Tyler: 0.6666, Lizzie: .333, }, ];Pensé en usar map y reducir las funciones de matriz, pero parece que no puedo entender eso.
Nota Además, cada objeto en la salida debe tener un valor de índice asociado con el objeto que se incrementa en uno.
Nota La longitud de la matriz de salida debe ser igual a la longitud más larga de cualquier matriz winRatio. Por ejemplo, si winRatio para 'Tyler' tiene 20 elementos, la matriz de salida debería tener 20 objetos.
Aquí hay una forma en que podría usar un reductor para hacerlo. Recorre la matriz de datos, tomando cada objeto de los jugadores y combinándolo en la matriz final en el formato que solicitó.
const reducer = (previousValue, currentValue,index) => { let current = {} currentValue.winRatio.forEach( (x, index) => { current = previousValue[index] ?? { index }; current[currentValue.name] = x previousValue[index] = current }) return previousValue } data.reduce(reducer, [])En cuanto a sus dos notas, la salida es una matriz, por lo que debe conocer su índice, pero podría agregar una línea al bloque forEach en este ejemplo agregando un par de clave/valor de índice si aún no existe uno mientras recorre. Para su segunda nota, no estoy seguro de cómo averiguarlo sin solo ordenar la matriz (o revisarla y anotar la longitud más larga de winRatio), así que supongo que podría hacer eso.
Un uso bastante sencillo de Object .fromEntries podría ayudar:
const format = (xs) => Array .from ({length: Math .max (...xs .map ((x) => x .winRatio .length))}, (_, i) => Object .fromEntries ([ ['index', i], ... data .filter (({winRatio}) => winRatio .length > i) .map (({name, winRatio}) => [name, winRatio [i]]) ]) ) const data = [{name: 'Tyler', winRatio: [1, 0.5, 0.6666666666666666]}, {name: 'Lizzie', winRatio: [0, 0.5, 0.3333333333333333]}]; console .log (format (data)) .as-console-wrapper {max-height: 100% !important; top: 0} Calculamos la longitud de la matriz winRatio más larga, creamos una nueva matriz de esa longitud y luego, para cada índice en la nueva matriz, creamos un objeto usando Object .fromEntries en una matriz que incluye una referencia a ese índice y el name y nth winRatio para cada entrada que tiene uno en ese índice.