Estoy tratando de calcular el promedio en campos de objetos de matriz anidados que están dentro de otra matriz. Aquí está la matriz que definí:
let arr = [ [{"category":"behavioural", "rating":3}, {"category":"technical", "rating":4.5}], [{"category":"behavioural", "rating":1}, {"category":"technical", "rating":2.5}], [{"category":"behavioural", "rating":4}, {"category":"technical", "rating":2}] ]Quiero calcular el promedio de calificaciones en su categoría respectiva y almacenarlo en un objeto.
Rendimiento esperado:
"metricsaverage" : { "behavioral" : 2.66, "technical" : 3 }Donde 2.66 y 3 es el promedio de todas las calificaciones con su respectiva categoría de la matriz anidada de objetos.
Demostración de trabajo:
// Input array let arr = [ [{"category":"behavioural", "rating":3}, {"category":"technical", "rating":4.5}], [{"category":"behavioural", "rating":1}, {"category":"technical", "rating":2.5}], [{"category":"behavioural", "rating":4}, {"category":"technical", "rating":2}] ]; // Converting multi-dimensional array into single dimension. let singleDimensionArr = [].concat(...arr); // grouping by category and resulting with an object using Array.reduce() method const groupByCategory = singleDimensionArr.reduce((group, item) => { const { category } = item; group[category] = group[category] ?? []; group[category].push(item.rating); return group; }, {}); // Finally calculating the average based on the category array we have. Object.keys(groupByCategory).forEach((item) => { const len = groupByCategory[item].length; groupByCategory[item] = groupByCategory[item].reduce((a, b) => a + b)/len; }) // result console.log(groupByCategory);ejemplo de trabajo aquí: https://jsfiddle.net/galeroy/ot1pkvqg/4/
let arr = [ [{"category":"behavioural", "rating":3}, {"category":"technical", "rating":4.5}], [{"category":"behavioural", "rating":1}, {"category":"technical", "rating":2.5}], [{"category":"behavioural", "rating":4}, {"category":"technical", "rating":2}] ] var behavioralTotal = 0, behavioralItems = 0, technicalTotal = 0, technicalItems = 0; arr.forEach(function(outerItem){ outerItem.forEach(function(innerItem){ if(innerItem.category === 'behavioural'){ behavioralTotal += innerItem.rating; behavioralItems++; } else if (innerItem.category === 'technical') { technicalTotal += innerItem.rating; technicalItems++ } }) }); console.log( 'metricsaverage = { \n' + '"behavioral" : ' + (behavioralTotal/behavioralItems).toFixed(2) + ',\n' + '"technical" : ' + (technicalTotal/technicalItems).toFixed(2) + '\n' + '}' )