在表单d.value的固定字段名称上选择时,避免D3.js“groupData未定义”错误

时间:2013-06-27 19:12:41

标签: arrays null d3.js

可能是微不足道的,但我似乎有一个嵌套的数据情况,我找不到任何指导。我有一个数组代表一个时间进程(索引),数据只是间歇性地可用:

elem[..]
elem[55].path[..]
elem[56]
elem[57]
elem[58].path[..]
elem[59]
elem[60].path[..]
elem[..]

空数据点为空:

elem[count] = null;

..而在待进一步使用之前,路径元素使用以下方式初始化:

elem[count].path = [];

收集大型数据集。在以下两个代码块的第一个中,我选择数组索引

classes[chan_index].elem_num_container = "elem_num_container" + "_" + comp_id + "_" + chan_index;

chan_selector.elem_num_container[chan_index] = chan_selector.vis_container[chan_index]
.selectAll(classes[chan_index].elem_num_container)
.data(function(d, i) {
    return d;
})
.enter()
.append("svg:g")
.attr("class", function(d, i) {
    return classes[chan_index].elem_num_container;
});

鉴于如此多的null元素,在第二个块(下面)中,嵌套的d.path可以理解地引发“groupData未定义”错误。

classes[chan_index].path_container = "path_container" + "_" + comp_id + "_" + chan_index;

chan_selector.path_container[chan_index] = chan_selector.elem_num_container[chan_index]
.selectAll(classes[chan_index].path_container)
.data(function(d, i) {
    return d.path;
})
.enter()
.append("svg:g")
.attr("class", function(d, i) {
    return classes[chan_index].path_container;
});

基本上,它归结为根据“d”参数选择数据,然后是“d.value”的嵌套选择。在保留索引的同时,我需要左右执行错误并选择存在的d.path元素。

我看到很多嵌套的JSON数据示例,但没有适用于这种情况。

封锁,并感谢任何帮助.. THX

1 个答案:

答案 0 :(得分:1)

从上面的回答中,消除空元素显然是可行的,对输入数据(检查:一切正常)和d3处理层次结构产生怀疑(格式错误:两个处理分支挂在同一节点上,一个传播数据,另一个 - 上面提到的分支 - 不是。)

作为回应,使用新的,间隙svg:g容器结构将两个分支与其父分开。结果:两个分支上的数据。

然后,正如上面的回答中所建议的,使用d.path,我在处理分支上添加了一个过滤器(即原始问题中的第一个和第二个代码块之间),格式为:

chan_selector.temp[chan_index] = chan_selector.elem_num_container[chan_index]
.filter(function(d) { return typeof(d.path) === 'object'; });

奇怪的是(鉴于过滤器对索引的影响)它起作用,给出习惯的d3 eyecandy。 : - )

感谢Superboggly和Lars Kotthoff的宝贵帮助和耐心。