Javascript 尝试嵌套选择时D3数据未定义
我在D3中处理json数据时遇到问题。从IJavascript 尝试嵌套选择时D3数据未定义,javascript,json,d3.js,Javascript,Json,D3.js,我在D3中处理json数据时遇到问题。从Iconsole.log时文件出现的事实判断,文件读取正确,并且根据我找到的所有示例的方式,文件的格式似乎正确。但是,当我尝试使用.data(function(json_data){return json_data.accessibility;})进行嵌套选择时,我得到:“无法读取未定义的属性'length' 我的职能: //load scenario json data d3.json("./SupportTool/scenario1result.jso
console.log
时文件出现的事实判断,文件读取正确,并且根据我找到的所有示例的方式,文件的格式似乎正确。但是,当我尝试使用.data(function(json_data){return json_data.accessibility;})
进行嵌套选择时,我得到:“无法读取未定义的属性'length'
我的职能:
//load scenario json data
d3.json("./SupportTool/scenario1result.json", function(error, json_data){
if(error) {return console.warn(error)};
console.log(json_data); //works
// add main SVG block
var svg = d3.select(d3id)
.append('svg')
.attr('width', 300)
.attr('height', 75)
.attr('id', 'svgblock');
// add an SVG group element for each scenario
var series = svg.selectAll('g.series')
.data(d3.keys(json_data))
.enter()
.append('g')
.attr('class', 'series');
var circles = series.selectAll("circle")
.data(function(json_data){return json_data.accessibility;})
.enter()
.append("circle");
var circleAttributes = circles
.attr("cx", 20)
.attr("cy", 20)
.attr("r", 20)
.style("color","blue"); });
我的json数据:
{
"meta":[{"sc":"1"},{"stratid":"1"}],
"accessibility":[
{"pop400":"77"},{"pop800":"86"},{"jobs800":"78"},{"pop400tr":"41"},{"pop800tr":"69"},{"jobs800tr":"80"}
],
"housing":[
{"newcom":"0"},{"redev":"100"},
{"apt5":"6"},{"apt4":"65"},{"twn":"14"},{"sglf":"15"},
{"urb":"0"},{"urbhec":"0"}
],
"transport":[
{"walk":"55"},{"transit":"18"},{"auto":"27"},
{"vkt":"11000"},
{"kmtr":"502"},{"form":"grid"},
{"lanekm":"3250"},
{"ghgtr":"67"},{"ghgres":"75"}
],
"costs":[
{"roadcapbils":null,"roadcap":null},
{"transitcapbils":null,"transitcap":null},
{"watercapbils":null,"watercap":null},
{"firecapbils":null,"firecap":null},
{"reccapbils":null,"reccap":null},
{"educapbils":null,"educap":null}
],
"opcosts":[
{"roadopbils":null,"roadop":null},
{"transitoppbils":null,"transitop":null},
{"wateropbils":null,"waterop":null},
{"fireopbils":null,"fireop":null},
{"parksopbils":null,"parksop":null}
] }
您遇到的问题来自这样一个事实:您正在使用已绑定到
系列
的数据函数将数据绑定到圆圈
:
var circles = series.selectAll("circle")
系列
已经从.data(d3.keys(json_data))
绑定了数据。因此,当您将一次传递一个对象的日志记录到圆圈的.data()
时,您只需获得json_data
的键即可
["meta", "accessibility", "housing", "transport", "costs", "opcosts"]
由于这是一个字符串列表,因此它们没有任何名为可访问性
的属性,因此会出现错误
我猜您正在尝试为json\u data.accessibility
中的每个项目添加圆圈,如果您将该行替换为
.data(json_data.accessibility)
哪个会过去
[{"pop400":"77"},{"pop800":"86"},{"jobs800":"78"},{"pop400tr":"41"},{"pop800tr":"69"},{"jobs800tr":"80"}]
到数据
。这个代码在我的机器上运行,在页面上画了六个圆圈
最后一点需要注意的是,您应该小心使用变量名。在传递给数据的函数中,您正在将json\u data
重新定义为该函数中的局部变量,这意味着您无法在该函数中访问实际的json数据。谢谢!当我用var circles=svg.selectAll(“circle”).data(json_data.accessibility)替换整个系列和圆圈块时,效果非常好代码>