'Find max for an array, 0 if array is empty

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



Solution 1:[1]

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;
};

Solution 2:[2]

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]))

Solution 3:[3]

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([]) );

Solution 4:[4]

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

Solution 5:[5]

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

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Satpal
Solution 3 Mohit Bhardwaj
Solution 4
Solution 5 Rajaprabhu Aravindasamy