Math.max doesn't take an array as an argument, but apply does. We'll use map to get an array with just the values we want. Apply calls Math.max with the given this value and the arguments represented by our array.
Math.max.apply(null,my_array_of_objects.map(obj => {return obj.key}))
You can also shorten this a little and use the spread operator in place of apply.
Math.max(...my_array_of_objects.map(obj => {return obj.i}))
There's a but...
At the time of writing this, Javascript has a built in argument limit of 65536. So if our array is going to get huge we'll need a new solution.
Reduce to the rescue
Reduce takes a callback function with four arguments. We'll use the first two accumulator (a) and currentValue (b). The first time through (a) will equal the first element in our array and (b) will be the second element in our array. The result of Math.max between those two elements will be returned to reduce and assigned to (a) for the next time around. The process continues for each element in the array.
my_array_of_objects.map(obj => {return obj.key}).reduce(function(a, b) {
return Math.max(a, b)
})
Conclusion
That's two ways to find the highest value in an array of objects. Pretty straight forward. One way for smaller datasets and one for larger. If you need to find the lowest number just replace max with min.