Tengo datos con valor así:
let data = [ { "id": "A", "year": "2019", "score": 105.38 }, { "id": "A", "year": "2020", "score": 91.8 }, { "id": "B", "year": "2020", "score": 104.18 }, { "nip": "B", "year": "2019", "score": 101.31 }, { "id": "C", "year": "2020", "score": 91.8 }, { "id": "C", "year": "2019", "score": 106.6 } ]Quiero calcular el puntaje promedio para cada identificación para que el resultado sea algo como esto:
let result = [{"id": A, "average":143.89}, {"id":B, "average":154.83}, {"id":C, "average":99.2}]¿Cómo puedo hacer eso?
Debe revisar la matriz recordando la sum y el count de entradas que ha visto por ID, luego puede construir su matriz de resultados con el promedio ( sum / count ) para cada ID, algo como esto:
const countsAndSums = new Map(); for (const {id, score} of data) { const entry = countsAndSums.get(id); if (!entry) { // Haven't seen this ID before countsAndSums.set(id, {id, count: 1, sum: score}); } else { // Update the count and sum for this ID ++entry.count; entry.sum += score; } } // Now you can build the array const result = [...countsAndSums.values()].map(({id, count, sum}) => ({id, average: sum / count}));Ejemplo en vivo:
let data = [ { "id": "A", "year": "2019", "score": 105.38 }, { "id": "A", "year": "2020", "score": 91.8 }, { "id": "B", "year": "2020", "score": 104.18 }, { "nip": "B", "year": "2019", "score": 101.31 }, { "id": "C", "year": "2020", "score": 91.8 }, { "id": "C", "year": "2019", "score": 106.6 } ]; const countsAndSums = new Map(); for (const {id, score} of data) { const entry = countsAndSums.get(id); if (!entry) { // Haven't seen this ID before countsAndSums.set(id, {id, count: 1, sum: score}); } else { // Update the count and sum for this ID ++entry.count; entry.sum += score; } } // Now you can build the array const result = [...countsAndSums.values()].map(({id, count, sum}) => ({id, average: sum / count})); console.log(result);Aquí hay una solución complicada de una sola línea:
let data = [ { "id": "A", "year": "2019", "score": 105.38 }, { "id": "A", "year": "2020", "score": 91.8 }, { "id": "B", "year": "2020", "score": 104.18 }, { "id": "B", "year": "2019", "score": 101.31 }, { "id": "C", "year": "2020", "score": 91.8 }, { "id": "C", "year": "2019", "score": 106.6 } ]; const averages = Object.entries(data.reduce((acc, { id, score }) => ({ ...acc, [id]: [...(acc[id] || []), score] }), {})) .map(([id, scores]) => ({ id, average: scores.reduce((acc, cur) => acc + cur, 0) / scores.length })); console.log(averages);