I have an array with objects. like this :
var arr = [{name: "Matt",age: 24 ,grades: [100,100,100,100]}
In my code I have 5 objects like these, all with random names/age/grades. I want to return the object with the biggest average grades. Here is my code :
var grades = [];
var arr = [{
name: "John",
age: 24,
grades: [100,100,100,100]
}, {
name: "Brock",
age: 23,
grades: [55,65,75,85]
}, {
name: "Matt",
age: 24,
grades: [88,78,65,95]
}, {
name: "Jay",
age: 28,
grades: [32,85,99,99]
}, {
name: "Monica",
age: 25,
grades: [45,63,82,81]
}];
function avg(x) {
var num = 0;
for (var i=0; i<x.length; i++) {
num += x[i]
}
return num / x.length;
}
//Go over the whole array
for (var i=0; i<arr.length; i++) {
for (var x=0; x<arr[i].grades.length; x++) {
var a = avg(arr[i].grades);
/////// What to do next? ^ returns all averages
}
}
console.log(arr);
That's it. I just want to return to console.log the object with the biggest average grades. can some1 help me please? or atleast give me an idea
-
You can sort the outer array in decreasing order by the average of each inner array and then grab the first element. How to sort an array of objects by some criteria.Felix Kling– Felix Kling2018年12月17日 19:45:26 +00:00Commented Dec 17, 2018 at 19:45
-
next is the same as you find the biggest value in any array.Muhammad Usman– Muhammad Usman2018年12月17日 19:46:46 +00:00Commented Dec 17, 2018 at 19:46
1 Answer 1
The inner loop is unnecessary.
var arr = [{ name: "John", age: 24, grades: [100,100,100,100] }, { name: "Brock", age: 23, grades: [55,65,75,85] }, { name: "Matt", age: 24, grades: [88,78,65,95] }, { name: "Jay", age: 28, grades: [32,85,99,99] }, { name: "Monica", age: 25, grades: [45,63,82,81] }];
function avg(x) {
var num = 0;
for (var i=0; i<x.length; i++) {
num += x[i]
}
return num / x.length;
}
let maxAvg = 0;
let maxAvgObj = null;
for (var i=0; i<arr.length; i++) {
var a = avg(arr[i].grades);
if (a > maxAvg) {
maxAvg = a;
maxAvgObj = arr[i];
}
}
console.log(maxAvg, maxAvgObj)
The logic can be ahem further reduced:
const arr = [{ name: "John", age: 24, grades: [100,100,100,100] }, { name: "Brock", age: 23, grades: [55,65,75,85] }, { name: "Matt", age: 24, grades: [88,78,65,95] }, { name: "Jay", age: 28, grades: [32,85,99,99] }, { name: "Monica", age: 25, grades: [45,63,82,81] }];
const [maxAvg, maxAvgObj] = arr.reduce(([currMaxAvg, currMaxAvgObj], obj) => {
const avg = obj.grades.reduce((sum, grade) => sum + grade, 0) / obj.grades.length;
return avg > currMaxAvg ? [avg, obj] : [currMaxAvg, currMaxAvgObj];
}, [[]]);
console.log(maxAvg, maxAvgObj)
answered Dec 17, 2018 at 19:45
lang-js