I am trying to calculate the average on nested array objects fields which is inside an another array. Here is the array I defined:
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}]
]
I want to calculate the average of ratings in its respective category and store it in an object.
Expected output:
"metricsaverage" : {
"behavioral" : 2.66,
"technical" : 3
}
Where 2.66 and 3 is the average of all ratings with its respective category from the nested array of objects.
Working Demo :
// 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);
working example here: 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' +
'}'
)