Javascript 嵌套对象的分析错误?

Javascript 嵌套对象的分析错误?,javascript,d3.js,Javascript,D3.js,有人能帮忙吗?我的数据通过从两个下拉列表中选择的值进行过滤,然后嵌套/汇总以获得这些相同值的每日平均值。下面的代码出现了“解析d错误时出现问题”。虽然filter和nest函数都返回正确的数据,但当我尝试将此数据应用到折线图以更新它时,问题会出现吗 d3.select("#parameterType").on("change", function() { d3.select("#dateTimeTaken").on("change", function()

有人能帮忙吗?我的数据通过从两个下拉列表中选择的值进行过滤,然后嵌套/汇总以获得这些相同值的每日平均值。下面的代码出现了“解析d错误时出现问题”。虽然filter和nest函数都返回正确的数据,但当我尝试将此数据应用到折线图以更新它时,问题会出现吗

    d3.select("#parameterType").on("change", function() 
    {   
    d3.select("#dateTimeTaken").on("change", function()
    {   
    var selectedParameter = document.getElementById("parameterType").value;
    var selectedMonth = document.getElementById("dateTimeTaken").value;

    //filter data by selected parameter and month    
    var selectedData = data.filter(function(d) { 
      return d.parameterType == selectedParameter  &&
      +d.dateTimeTaken.getMonth() == (selectedMonth - 1);});

    console.log(selectedData);//returning correct data

    //get average reading for each day within selected month 
    var newdata = d3.nest()
        .key(function(d) {return d3.time.day(d.dateTimeTaken);})    
        .sortKeys(d3.ascending)
        .rollup(function(d) 
        {
            return {
            mean: d3.mean(selectedData, function(d) {return +d.reading;})};
        })
    .entries(selectedData);
    console.log(newdata);//returning correct data

    //UPDATE GRAPH

    //not returning correct max values?     
    x.domain(d3.extent(newdata, function(d) { return d.key; }));
    y.domain([0, d3.max(newdata, function(d) { return d.values; })]);

    svg.select("path.line")
        .attr( "d", line(newdata));

    svg.select(".x.axis")
        .transition()
        .duration(750)
        .ease("linear")
        .call(xAxis);

    svg.select(".y.axis")
        .transition()
        .duration(750)
        .ease("linear")
        .call(yAxis);
在本报告中,有两个问题导致上述问题。这两个问题似乎都源于对数据在D3中是如何嵌套和汇总的误解

解释
var newdata=d3.nest()
.key(函数(d){return d.datetimetake;})
.排序键(d3.升序)
.条目(数据);
这将转换以下类型的对象:

var数据=[{
参数类型:“a”,
日期时间:“2013-01-01 12:00:00”,
阅读:100
}, {
参数类型:“a”,
日期时间:“2013-01-02 12:00:01”,
阅读:101
}];
致:

[
{
“密钥”:“2013-01-01 12:00:00”,
“价值观”:[
{
“参数类型”:“a”,
“DateTimetake”:“2013-01-01 12:00:00”,
“阅读”:100
}
]
},
{
“密钥”:“2013-01-02 12:00:01”,
“价值观”:[
{
“参数类型”:“a”,
“DateTimetake”:“2013-01-02 12:00:01”,
“阅读”:101
}
]
}
]
values
字段是一个将原始数据项累加在一起的数组。 然后将数组作为参数,该数组将是
,根据这些值计算一个聚合度量(
在您的例子中为mean
),并将其放置在键
中的数组位置

您的
汇总功能:

//所选参数在所选月份内每天的平均读数
// ...
.汇总(功能(d){
return{mean:d3.mean(selectedData,函数(d){return+d.reading;})};})
完全无视这个论点。我认为应该是:

.rollup(函数(d){
return{mean:d3.mean(d,函数(d){return+d_.reading;})};})
现在,生成的数组需要:

[
{
“密钥”:“2013-01-01 12:00:00”,
“价值观”:{
“平均数”:100
}
},
{
“密钥”:“2013-01-02 12:00:01”,
“价值观”:{
“平均数”:101
}
}
]
请注意,
values
键中还有另一个对象,其中包含
mean
。将
y
轴的范围计算为:

y.domain([0,d3.max(newdata,函数(d){返回d.values;})];
最大值不正确的原因是,您要求d3计算
值中
对象
的最大值。这种操作的结果是不明确的。相反,您应该要求超过
的最大值。平均值为:

y.domain([0, d3.max(newdata, function(d) { return d.values.mean; })]);
这会产生正确的结果,如本JSFIDLE所示:

结论 这是关于如何使嵌套和rollupus正确工作的。现在来解决一些其他问题。
变量具有以下访问器:

var line=d3.svg.line()
.x(函数(d){return x(d.datetimetake);})
.y(函数(d){返回y(d.reading);});
这在您呼叫的时间内非常有效:

svg.append(“路径”)
.attr(“类”、“行”)
.attr(“d”,行(数据));

但是,
newdata
的格式如上所示,它在顶层有
,而不是
日期时间
读取
。因此,您最好使用
selectedData
,它只是
数据
过滤并保留数据结构。但是,如果您想画一条不同的线(例如,使用
平均值
),那么您应该定义一个新的
d3.svg.line()
具有不同访问器的线生成器。

看起来与。你能更新你的代码,包括你如何初始化
变量吗我需要一条线来表示平均值,这就是我遇到的困难。所以我需要定义一个新行,例如var meanline=d3.svg.line().x(函数(d){returnx(d.key);}).y(函数(d){returny(d.values.mean);});-然后更新-svg.select(“path.meanline”).attr(“d”,line(newdata));???您可能指的是
svg.select(“path.meanline”).attr(“d”,meanline(newdata))但是,是的,看起来差不多正确。谢谢:)解析错误消失了,但由于某些原因,只有y轴更新。未使用sortKeys对数据进行排序,并且x域未返回最大值-扩展数据块是否与键值一起工作?更新的要点:,键返回的值将转换为字符串,由于默认的字符串格式不是按字母顺序排序的,因此您会得到似乎未排序的x轴和不正确的时间轴值。考虑使用<代码> totoSistSnter()/<代码> >代码>键/代码>函数,因为可以按字母顺序排序。然后对于
.extent
,使用格式
%Y-%m-%bT%H:%m:%SZ“
将其解析回一个日期。获取错误消息“Object 2013-03-01T14:03:58.000Z没有方法“getFullYear”-是否认为可能与d3.time.day有关?