Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting the min and max value in JavaScript, but from a 2D array

I know this gets asked again and again but hear me out - this question is slightly different.

I can get a max or min from a 1D array like this:

var w_max = Math.max.apply(Math, myArray); 
var w_min = Math.min.apply(Math, myArray); 

But my array is of the type:

[[[1, 112.0],[2,5.12],[3,113.1],[4,33.6],[5,85.9],[6,219.9]]]
//max = 219.9, min = 5.12

and I need to get min and max of the second value, with the first value being an index of sorts. I've tried

myArray[][], myArray[0][0], myArray[[1]] 

and more. Console logging shows I'm getting NaN or -Infinity!!

like image 491
Subjective Effect Avatar asked Apr 30 '14 19:04

Subjective Effect


3 Answers

You can map the array to the second values of the elements:

var arr = [[[1, 112.0],[2,5.12],[3,113.1],[4,33.6],[5,85.9],[6,219.9]]];
var values = arr[0].map(function(elt) { return elt[1]; });
var max = Math.max.apply(null, values);
var min = Math.min.apply(null, values);
like image 187
Ted Hopp Avatar answered Nov 01 '22 00:11

Ted Hopp


I really admired the sleek readability of @TedHopp 's solution -- so much so that I decided to adapt it into a function. The practicality of the function is still yet to be seen, but I liked the idea of being able to identify the min / max of a specified index within a 2D array.

function getMinMaxOf2DIndex (arr, idx) {
    return {
        min: Math.min.apply(null, arr.map(function (e) { return e[idx]})),
        max: Math.max.apply(null, arr.map(function (e) { return e[idx]}))
    }
} 

getMinMaxOf2DIndex() takes two parameters, arr -- an array, and idx the index of the values to compare.

Usage Examples:

// using the OP's array as an example
var array = [[1, 112.0],[2,5.12],[3,113.1],[4,33.6],[5,85.9],[6,219.9]];

getMinMaxOf2DIndex(array, 0); // {min: 1, max: 6}
getMinMaxOf2DIndex(array, 1); // {min: 5.12, max: 219.9}

// and so on...
var array = [[1, 9, 6 , 3], [2, 4, 7, 2], [6, 5, 9, 4]];
getMinMaxOf2DIndex(array, 2); // {min: 1, max: 6}
getMinMaxOf2DIndex(array, 3); // {min: 6, max: 9}
like image 42
bartlb Avatar answered Nov 01 '22 00:11

bartlb


for big 2D arrays use this avoid function.prototype.apply as in above almost all answers i can see it. because it can handle only limited amount of array length .

function MaxMin2dray(arr, idx){
    var max = Number.MIN_VALUE;
    var min = Number.MAX_VALUE;
     arr.forEach(function(e) {
     if (max < e[idx]) {
      max = e[idx];
    }
    if (min > e[idx]) {
      min = e[idx];
    }
  });
  return {max: max, min: min};
}
like image 27
user889030 Avatar answered Oct 31 '22 23:10

user889030