Estoy trabajando con Nodejs y estoy atascado en el siguiente problema y busco las mejores prácticas para hacerlo.
Tengo un conjunto de matrices que sería así:
[ { id: 'something1', score: 180, rank: 1, avatar: 'avatar_3', prize: 1280 }, { id: 'something2', score: 180, rank: 2, avatar: 'avatar_3', prize: 1073 }, { id: 'something3', score: 161, rank: 3, avatar: 'avatar_2', prize: 902 }, { id: 'something4', score: 161, rank: 4, avatar: 'avatar_7', prize: 758 }, { id: 'something5', score: 161, rank: 5, avatar: 'avatar_8', prize: 535 }, { id: 'something6', score: 161, rank: 6, avatar: 'avatar_3', prize: 318 }, { id: 'something7', score: 143, rank: 7, avatar: 'avatar_3', prize: 267 }, { id: 'something8', score: 143, rank: 8, avatar: 'avatar_4', prize: 224 }, { id: 'something9', score: 140, rank: 9, avatar: 'avatar_3', prize: 210 } ]y ahora quiero agregar todos esos premios que tienen puntajes idénticos y luego dividirlos por el total de jugadores que tienen el mismo puntaje y luego actualizar la matriz existente con nuevos valores de premios.
Aquí está la salida de muestra que estoy buscando:
[ { id: 'something1', score: 180, rank: 1, avatar: 'avatar_3', prize: 1176 }, { id: 'something2', score: 180, rank: 2, avatar: 'avatar_3', prize: 1176 }, { id: 'something3', score: 161, rank: 3, avatar: 'avatar_2', prize: 628}, { id: 'something4', score: 161, rank: 4, avatar: 'avatar_7', prize: 628}, { id: 'something5', score: 161, rank: 5, avatar: 'avatar_8', prize: 628}, { id: 'something6', score: 161, rank: 6, avatar: 'avatar_3', prize: 628}, { id: 'something7', score: 143, rank: 7, avatar: 'avatar_3', prize: 245}, { id: 'something8', score: 143, rank: 8, avatar: 'avatar_4', prize: 245}, { id: 'something9', score: 140, rank: 9, avatar: 'avatar_3', prize: 210 } ]Entonces, ¿cuál sería la mejor manera de resolver este problema? Gracias
Construya una tabla hash de totales primero (he usado un for...of loop ), y luego map los datos y reemplace el valor del prize de cada objeto con el total que coincida con el valor total en la tabla hash para ese puntaje .
const data=[{id:"something1",score:180,rank:1,avatar:"avatar_3",prize:1176},{id:"something2",score:180,rank:2,avatar:"avatar_3",prize:1176},{id:"something3",score:161,rank:3,avatar:"avatar_2",prize:628},{id:"something4",score:161,rank:4,avatar:"avatar_7",prize:628},{id:"something5",score:161,rank:5,avatar:"avatar_8",prize:628},{id:"something6",score:161,rank:6,avatar:"avatar_3",prize:628},{id:"something7",score:143,rank:7,avatar:"avatar_3",prize:245},{id:"something8",score:143,rank:8,avatar:"avatar_4",prize:245},{id:"something9",score:140,rank:9,avatar:"avatar_3",prize:210}]; const out = {}; // Iterate over the data for (const obj of data) { // Destructure the score an prize from each object const { score, prize } = obj; // Initialise the key/value of an `out` property // with an object with default values out[score] ??= { players: 0, prizes: 0 }; // Increase the players count ++out[score].players; // Add the prize of the current object to // the `prizes` value out[score].prizes += obj.prize; // Calculate the current score out[score].total = out[score].prizes / out[score].players; } // Return a new array of objects updating each // score with the `total` value from the hash object const result = data.map(obj => { return { ...obj, prize: out[obj.score].total }; }); console.log(result);esto debería hacerlo
const computeAveragePrizes = (arr) => { const grouped = arr.reduce((acc , cur) => { const existing = acc[cur.score]; if (existing) { return { ...acc , [cur.score]: { total: existing.total + cur.prize , count: existing.count + 1 } } } return { ...acc , [cur.score]: { total: cur.prize , count: 1 } } } , {} ); return arr.map(item => ({ ...item, prize: grouped[item.score].total / grouped[item.score].count })) }