Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to find the max/min of a nested array in javascript?

I want to find the maximum of a nested array, something like this:

a = [[1,2],[20,3]] d3.max(d3.max(a)) // 20 

but my array contains a text field that I want to discard:

a = [["yz",1,2],["xy",20,3]] d3.max(a) // 20 
like image 277
nachocab Avatar asked May 12 '12 14:05

nachocab


2 Answers

If you have a nested array of numbers (arrays = [[1, 2], [20, 3]]), nest d3.max:

var max = d3.max(arrays, function(array) {   return d3.max(array); }); 

Or equivalently, use array.map:

var max = d3.max(arrays.map(function(array) {   return d3.max(array); })); 

If you want to ignore string values, you can use array.filter to ignore strings:

var max = d3.max(arrays, function(array) {   return d3.max(array.filter(function(value) {     return typeof value === "number";   })); }); 

Alternatively, if you know the string is always in the first position, you could use array.slice which is a bit more efficient:

var max = d3.max(arrays, function(array) {   return d3.max(array.slice(1)); }); 

Yet another option is to use an accessor function which returns NaN for values that are not numbers. This will cause d3.max to ignore those values. Conveniently, JavaScript's built-in Number function does exactly this, so you can say:

var max = d3.max(arrays, function(array) {   return d3.max(array, Number); }); 
like image 193
mbostock Avatar answered Sep 28 '22 15:09

mbostock


Use this:

function arrmax(arrs) {     var toplevel = [];      var f = function(v) {         return !isNaN(v);     };      for (var i = 0, l = arrs.length; i<l; i++) {         toplevel.push(Math.max.apply(window, arrs[i].filter(f)));     }     return Math.max.apply(window, toplevel); } 

or better:

function arrmax(arrs) {     if (!arrs || !arrs.length) return undefined;     var max = Math.max.apply(window, arrs[0]), m,         f = function(v){ return !isNaN(v); };     for (var i = 1, l = arrs.length; i<l; i++) {         if ((m = Math.max.apply(window, arrs[i].filter(f)))>max) max=m;     }     return max; } 

See MDN for Array.filter method details.

like image 32
kbec Avatar answered Sep 28 '22 14:09

kbec