Javascript D3访问2d对象数组中的最大值-Y轴

Javascript D3访问2d对象数组中的最大值-Y轴,javascript,d3.js,Javascript,D3.js,我有一个D3堆积面积图,我试图在图中重新计算刷牙时的Y轴。问题是,当我重新计算Y轴的最大值时,它不是所有不同层的组合,它只是最后一层。例如,如果我刷了1/17和1/20日期,我将得到45作为最大Y轴值,而不是95(50+45)。以下是数据: [ { "key": "Failed", "vis": "1", "values": [ { "date": "2014-01-17T05:00:00.000Z",

我有一个D3堆积面积图,我试图在图中重新计算刷牙时的Y轴。问题是,当我重新计算Y轴的最大值时,它不是所有不同层的组合,它只是最后一层。例如,如果我刷了1/17和1/20日期,我将得到45作为最大Y轴值,而不是95(50+45)。以下是数据:

[
  {
     "key": "Failed",
     "vis": "1",
     "values": [
        {
           "date": "2014-01-17T05:00:00.000Z",
           "total": 50
        },
        {
           "date": "2014-01-20T05:00:00.000Z",
           "total": 23
        }
     ]
  },
  {
     "key": "Success",
     "vis": "1",
     "values": [
        {
           "date": "2014-01-17T05:00:00.000Z",
           "total": 45
        },
        {
           "date": "2014-01-20T05:00:00.000Z",
           "total": 12
        }
     ]
  }
]
下面是我正在使用的一些示例代码。我知道外部循环的每次迭代都会抹去之前的循环,但我不确定如何着手修复它:

for (var i = 0; i < dataSeries.length; i++) {
    if(dataSeries[i]['vis'] === "1") {

        dataFiltered = dataSeries[i]['values'].filter(function(d) {

            if((d.date >= main_x.domain()[0]) && (d.date <= main_x.domain()[1])) {

                // this is just returning the biggest total in the date range from the last layer (i.e.: 'Failed'),
                // not the greatest of all the layers for that day                       
                return yValue(d);   
            }                           
        });
    }
}
for(var i=0;i如果((d.date>=main_x.domain()[0])&(d.date在
dataSeries
的每次迭代中,您都在执行
dataFiltered
。在
dataSeries
中,堆栈中的每个级别都有一个元素,因此这意味着
dataFiltered
将只包含最后一个元素的值

但是,即使您解决了这个问题,您设置y刻度域的方式仍然有些奇怪:

main_y.domain([0, d3.sum(dataFiltered.map(function(d) { return d.total; }))]);
这是将域的上限值设置为拉丝范围内所有数据点的总和。您可能实际需要的是该范围内的最大完全堆叠高度

您可以这样做:

var dataFiltered = dataSeries.map(function(series) {
    return series.values.filter(function(d) {
        if((d.date >= main_x.domain()[0]) && (d.date <= main_x.domain()[1])) {
            return yValue(d);
        }
    });
});
此时,
dataStackSums
包含每个X轴值(日期)的属性,该值表示该堆栈的Y轴总和。从这里您只需确定最大堆栈:

var max = 0;
Object.keys(dataStackSums).forEach(function(key) {
    max = Math.max(max, dataStackSums[key]);
});
然后您可以设置域:

main_y.domain([0, max]);

请注意,为了清晰起见,我将这些步骤分开,但为了提高效率,您可以将过滤和堆栈定向折叠为一个步骤。

谢谢-这非常有效(我对文章进行了一次小编辑)。
main_y.domain([0, max]);