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
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 @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 Commented Jul 21, 2016 at 9:24
6 Answers
Reset to default 6You 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;
};
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]))
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([]) );
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
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
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