0

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

asked Dec 17, 2018 at 19:42
2
  • 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. Commented Dec 17, 2018 at 19:45
  • next is the same as you find the biggest value in any array. Commented Dec 17, 2018 at 19:46

1 Answer 1

2

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

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.