Supongamos que tengo una matriz de objetos,
const book = [{'name':'alpha','readingTime':1231},{'name':'alpha','readingTime':1254}, {'name':'beta','readingTime':190}, {'name':'theta','readingTime':909},{'name':'theta','readingTime':10}]Quiero calcular el promedio para cada nombre, de modo que el O/P esperado sea
**{alpha:1242.5, beta:190, theta:459.5}**Para esto lo intenté como,
let calculatedValue = book.reduce((acc,curr) => acc+curr.readingTime,0)/book.lengthEsto me da un promedio para todo el objeto.
No puedo formar la lógica correspondiente.
Cualquier orientación sería realmente útil. Si alguien necesita más información, por favor hágamelo saber.
Puede agrupar por name y obtener el recuento y el total de tiempo de readingTime y crear un nuevo objeto con los promedios.
const books = [{ name: 'alpha', readingTime: 1231 }, { name: 'alpha', readingTime: 1254 }, { name: 'beta', readingTime: 190 }, { name: 'theta', readingTime: 909 }, { name: 'theta', readingTime: 10 }], averages = Object.fromEntries( Object.entries(books.reduce((r, { name, readingTime }) => { r[name] = r[name] || { count: 0, total: 0 }; r[name].count++; r[name].total += readingTime; return r; }, {})) .map(([k, { count, total }]) => [k, total / count]) ); console.log(averages);Aquí hay otra solución simple para usted.
const book = [{'name':'alpha','readingTime':1231},{'name':'alpha','readingTime':1254}, {'name':'beta','readingTime':190}, {'name':'theta','readingTime':909}, {'name':'theta','readingTime':10}] const result = {}; Object.values(book.reduce((acc, current) => { acc[current.name] = acc[current.name] || { count: 0, total: 0 }; acc[current.name].total += current.readingTime; acc[current.name].count += 1; acc[current.name].name = current.name; return acc; }, {})).forEach(({ name, count, total }) => { result[name] = total / count; }); console.log(result)Necesita más optimización (siéntase libre de editar) pero funciona
const book = [{'name':'alpha','readingTime':1231},{'name':'alpha','readingTime':1254}, {'name':'beta','readingTime':190}, {'name':'theta','readingTime':909},{'name':'theta','readingTime':10}] function avgReading(arr){ let alpha = { lengtharr : 0 ,readingAll : 0 }; let beta = {...alpha}; let theta = {...alpha}; arr.forEach((item) => { if(item.name === 'alpha') alpha.lengtharr++; alpha.readingAll = alpha.readingAll + item.readingTime; if(item.name === 'beta') beta.lengtharr++; beta.readingAll = beta.readingAll + item.readingTime; if(item.name === 'theta') theta.lengtharr++; theta.readingAll = theta.readingAll + item.readingTime; }); const obj = { 'alpha' : alpha.readingAll /alpha.lengtharr, 'beta' : beta.readingAll /beta.lengtharr, 'theta' : theta.readingAll /theta.lengtharr } return obj; } console.log(avgReading(book))