4

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

1
  • 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 Commented Jul 21, 2016 at 9:24

6 Answers 6

6

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;
};
Sign up to request clarification or add additional context in comments.

1 Comment

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

Comments

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

Comments

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

Comments

1

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

Comments

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

3 Comments

What if I had [-Infinity, -1]?
@trincot -1 would be returned hence it is the maximum value there.
True, I was too quick. But [-Infinity] will give 0.

Your Answer

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.