我想找到嵌套数组的最大值,如下所示:
a = [[1,2],[20,3]]
d3.max(d3.max(a)) // 20
但我的数组包含一个我想丢弃的文本字段:
a = [["yz",1,2],["xy",20,3]]
d3.max(a) // 20
我想找到嵌套数组的最大值,如下所示:
a = [[1,2],[20,3]]
d3.max(d3.max(a)) // 20
但我的数组包含一个我想丢弃的文本字段:
a = [["yz",1,2],["xy",20,3]]
d3.max(a) // 20
如果您有一个嵌套的数字数组 ( arrays = [[1, 2], [20, 3]]),请嵌套d3.max:
var max = d3.max(arrays, function(array) {
  return d3.max(array);
});
或者等效地,使用array.map:
var max = d3.max(arrays.map(function(array) {
  return d3.max(array);
}));
如果要忽略字符串值,可以使用array.filter忽略字符串:
var max = d3.max(arrays, function(array) {
  return d3.max(array.filter(function(value) {
    return typeof value === "number";
  }));
});
或者,如果您知道字符串始终位于第一个位置,则可以使用更高效的array.slice :
var max = d3.max(arrays, function(array) {
  return d3.max(array.slice(1));
});
另一种选择是使用访问器函数,该函数返回NaN不是数字的值。这将导致 d3.max 忽略这些值。方便的是,JavaScript 的内置Number函数正是这样做的,所以你可以说:
var max = d3.max(arrays, function(array) {
  return d3.max(array, Number);
});
用这个:
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);
}
或更好:
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;
}
有关 Array.filter 方法的详细信息,请参阅MDN。
您可以展平数组并将函数应用于每个成员
Array.prototype.flatten= function(fun){
    if(typeof fun!= 'function') fun= '';
    var A= [], L= this.length, itm;
    for(var i= 0; i<L; i++){
        itm= this[i];
        if(itm!= undefined){
            if(!itm.flatten){
                if(fun) itm= fun(itm);
                if(itm) A.push(itm);
            }
            else A= A.concat(itm.flatten(fun));
        }
    }
    return A;
}
var a= [["yz", 1, 2], ["xy", 20, 3]], max=-Infinity;
var max=Math.max.apply(a, a.flatten(Number));
如果您现在确切地想要测试哪些列,您可以使用:
var columns = ["ColumnA", "ColumnB", "ColumnC"];
var max = selectedMax(columns,dataset);
var min = selectedMin(columns,dataset)
function selectedMax(columns, dataset) {
    var max;
    columns.forEach(function(element, index, array) {
        var tmpmax = d3.max(dataset, function(d) {
            return +d[element];
        });       
        max = (tmpmax > max || max === undefined) ? tmpmax : max;
    });
    return max;
}
function selectedMin(columns, dataset) {
    var min;
    columns.forEach(function(element, index, array) {
        var tmpmin = d3.min(dataset, function(d) {
            return +d[element];
        });
        min = (tmpmin < min || min === undefined) ? tmpmin : min;
    });  
return min;
}
这是一个残酷的黑客攻击,但是查看 的源代码,d3.max您最好的选择可能是定义 ad3.max1通过复制该代码丢弃第一个元素,但替换i=-1为i=0. 该链接上的代码摘录在这里。请注意,我不是 d3.js 的普通用户,但根据我对库的了解,您需要确保您的版本具有f.call与此功能类似的案例,以便它可以正确响应实时更新。
d3.max = function(array, f) {
  var i = -1,
      n = array.length,
      a,
      b;
  if (arguments.length === 1) {
    while (++i < n && ((a = array[i]) == null || a != a)) a = undefined;
    while (++i < n) if ((b = array[i]) != null && b > a) a = b;
  } else {
    while (++i < n && ((a = f.call(array, array[i], i)) == null || a != a)) a = undefined;
    while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b;
  }
  return a;
};
那么它只是d3.max(d3.max1(a))。
再加上d3.maxjavascriptNumber作为访问器:
var max = d3.max(d3.merge(arrays), Number);
例如:
var input = [["yz", 1, 2], ["xy", 20, 3]];
var max = d3.max(d3.merge(input), Number);
console.log(max);<script src="https://d3js.org/d3-array.v2.min.js"></script>