2

I need a clean way of finding max for an array in JavaScript. Say it is arrayMax, then:

arrayMax([]) // => 0
arrayMax([1], [2]) // => 2
arrayMax([-1]) // => -1

What I've tried:

Math.max.apply(null, [1,2,3]) // => 3

But it doesn't work for:

Math.max.apply(null, []) // => -Infinity

Note that it's not an duplication with this question since I want the empty array to return 0, instead of -Infinity

ggorlen
  • 44,755
  • 7
  • 76
  • 106
songyy
  • 4,323
  • 6
  • 41
  • 63
  • 1
    @Satpal: tried, and updated. Note that Math.max([]) gives u 0 because [] is converted into number 0. You can try Math.max([1,2,3]) and see how – songyy Jul 21 '16 at 09:24

6 Answers6

5

You need a function that checks the length of the array:

function arrayMax(arr) {
    return arr.length ? Math.max.apply(null, arr) : 0;
};

Solutions that start with 0 will produce wrong results for arrays with only negative values.

With ES6 support, you can avoid the apply method and use the spread operator:

function arrayMax(arr) {
    return arr.length ? Math.max(...arr) : 0;
};
trincot
  • 317,000
  • 35
  • 244
  • 286
  • If you have fairly large arrays, this will fail. After _500,000_, this throws: `Math.max(...Array(500001).fill().map(_ => Math.random()))` gives `RangeError: too many function arguments`. – romellem Apr 19 '22 at 14:05
4

check array's length property.

var arrayMax = function(arr) {
  //Check length 
  if (arr.length == 0)
    return 0;

  //Otherwise use take advantage of native API
  return Math.max.apply(null, arr);
};

console.log(arrayMax([]))
console.log(arrayMax([3,5,1]))
Satpal
  • 132,252
  • 13
  • 159
  • 168
2

This method does not require checking array's length. There may be some other drawbacks though:

function arrayMax( arr )
{
  return arr.reduce(function(prevValue, curValue, curIndex){
    return Math.max( prevValue, curValue );
  }, 0);
}

console.log( arrayMax(["1", "-2"]) );
console.log( arrayMax(["10", "2", ""]) );
console.log( arrayMax([]) );
Mohit Bhardwaj
  • 9,650
  • 3
  • 37
  • 64
1
myArray.reduce(function(prev,current){
    return prev===null ? current : Math.max(prev, current);
}, null) || 0

or very succinctly with ES6 arrow functions:

 myArray.reduce((prev,current) => 
     prev===null ? current : Math.max(prev, current), null) || 0
spender
  • 117,338
  • 33
  • 229
  • 351
0

You can do it by,

function arrayMax(){
 var val = Math.max.apply(null, [].concat.apply([], [...arguments]));
 return val == -Infinity ? 0 : val
}

console.log(arrayMax([1],[22,3,2],[3])); //22
console.log(arrayMax([1],[3])); //3
console.log(arrayMax([1])); //1
console.log(arrayMax([])); //0
Rajaprabhu Aravindasamy
  • 66,513
  • 17
  • 101
  • 130
0

For those who find this question but need a solution for arrays with only positive numbers:

If you are on ES >= 6 this is astonishingly simple.
You can use the spread operator (mentioned in other answers) and add an additional zero parameter to Math.max. The additional zero kicks in if the given array is empty:

Math.max(...[], 0)          // => 0
Math.max(...[22,88,55], 0)  // => 88
Jpsy
  • 20,077
  • 7
  • 118
  • 115