ffleandro
ffleandro

Reputation: 4041

Javascript max() for array column

Usually when I need to find the max value of an array I use this very simple code: var max = Math.max.apply(Math, array);

However, now I have a multidimensional array in which for each line I have an array with 5 columns. Is there a similar way to find the max value for a certain column? Right now I'm doing:

var maxFunc = function(data){
    var max = 0;
    data.forEach(function(value){
        max = Math.max(max, value[0]);
    });
    return max;
};

I was curious if there was a prettier/simpler way of doing this?

Upvotes: 12

Views: 9052

Answers (2)

Ja͢ck
Ja͢ck

Reputation: 173642

I would write it as such:

Math.max.apply(Math, array.map(v => v[0]));

The array.map will transform the original array based on your picking logic, returning the first item in this case. The transformed array is then fed into Math.max()

To avoid creating a new array, you can also reduce the array to a single value:

array.reduce((max, current) => Math.max(max, current[0]), -Infinity)

As you can see, we need to add the initial value of -Infinity, which is returned if the array is empty.

Upvotes: 17

zzzzBov
zzzzBov

Reputation: 179166

This is a great application for Array.prototype.reduce:

max = data.reduce(function(previousVal, currentItem, i, arr) {
    return Math.max(previousVal, currentItem[0]);
}, Number.NEGATIVE_INFINITY);

This also avoids the bug in your code that would happen if all the values in data are less than 0. You should be comparing against Number.NEGATIVE_INFINITY rather than 0.

Alternatively, you could normalize the data before reducing to the max value:

max = data.map(function (d) {
    return d[0];
}).reduce(function (p, c, i, arr) {
    return Math.max(p, c);
});

Upvotes: 9

Related Questions