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
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); });
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With