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 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' +
'}'
)
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);
Try this
const array = [[{"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}]];
let arrBeh = [];
let arrTech = [];
array.forEach( e => {
arrBeh.push(e[0]["rating"]);
arrTech.push(e[1]["rating"]);
})
calcAvg = (arr) => {
const sum = arr.reduce((a, b) => a + b, 0);
const avg = (sum / arr.length) || 0;
console.log(avg)
}
calcAvg(arrBeh);
calcAvg(arrTech);
The variable arr is referencing Array of Objects. I would iterate the array and retrieve the values as needed. So the syntax to iterate the array and get the rating value is: arr[i].rating where i is the counter variable.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.