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

  • 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](https://stackoverflow.com/q/979256/218196). – Felix Kling Dec 17 '18 at 19:45
  • next is the same as you find the biggest value in any array. – Muhammad Usman Dec 17 '18 at 19:46

1 Answers1

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)
ic3b3rg
  • 14,629
  • 4
  • 30
  • 53