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