如何在javascript中找到嵌套数组的最大/最小值?

nac*_*cab 30 javascript d3.js

我想找到嵌套数组的最大值,如下所示:

a = [[1,2],[20,3]]
d3.max(d3.max(a)) // 20
Run Code Online (Sandbox Code Playgroud)

但我的数组包含一个我要丢弃的文本字段:

a = [["yz",1,2],["xy",20,3]]
d3.max(a) // 20
Run Code Online (Sandbox Code Playgroud)

mbo*_*ock 74

如果你有一个嵌套的数字数组(arrays = [[1, 2], [20, 3]]),嵌套d3.max:

var max = d3.max(arrays, function(array) {
  return d3.max(array);
});
Run Code Online (Sandbox Code Playgroud)

或者等效地,使用array.map:

var max = d3.max(arrays.map(function(array) {
  return d3.max(array);
}));
Run Code Online (Sandbox Code Playgroud)

如果要忽略字符串值,可以使用array.filter忽略字符串:

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

或者,如果您知道字符串始终位于第一个位置,则可以使用更有效的array.slice:

var max = d3.max(arrays, function(array) {
  return d3.max(array.slice(1));
});
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用访问器函数,该函数返回NaN非数字的值.这将导致d3.max忽略这些值.方便的是,JavaScript的内置Number函数就是这样,所以你可以说:

var max = d3.max(arrays, function(array) {
  return d3.max(array, Number);
});
Run Code Online (Sandbox Code Playgroud)


kbe*_*bec 5

用这个:

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);
}
Run Code Online (Sandbox Code Playgroud)

或更好:

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;
}
Run Code Online (Sandbox Code Playgroud)

有关Array.filter 方法的详细信息,请参阅MDN