短版本:绑定d3.js JSON数据集中第一个数据元素的DOM元素始终显示且无法删除,所有其他元素的行为与预期一致。
使用d3.js,尝试生成随后使用不同数据集填充的标准计划设置。拉一些嵌套的JSON数据,标准的输入/更新/退出格式来修改计划显示。需要其他地方可用的结构(struct)数据,因此在过滤和附加之前将其分配给全局:
d3.json('php/controllers/sched_struct_endpoint.php?set=' + set, function(d) {
struct = d;
drawAxis();
});
(drawAxis()是重绘函数,该函数下面的代码)。一切都运行正常,除了第一个元素(星期日的日程安排显示)总是绑定/显示 - 所有其他元素完全按预期添加/删除。认为问题可能出在我的数据过滤器上;使用日期编号作为关键功能,如果选择“全部”,则打算显示所有日期;如果选择了一天,则仅显示指定日期。星期日是第1天,星期一2等等 - 但结果数据显示总是[1,2]或[1,5] - 从不只是[2]或[5]。显示所有[1,2,3,4,5,6,7]按预期工作。
dayData = chartAxis.selectAll(".titleDay")
.data(struct, function(d) { return day === 'All' ? d.day_number : d.day_number === day; } );
var titleDay = dayData.enter()
.append("g")
.attr("class","titleDay");
titleDay
.attr("id", function(d) { return d.day_name;})
.attr("transform", function(d,i) { return "translate(0," + (day == 'All' ? i * elem_height * 1.05 : 0) + ")" ; })
titleDay.append("rect")
.attr("width",daywidth)
.attr("height", elem_height);
titleDay.append("text")
.text(function(d) { return d.day_name; })
.attr("text-anchor","middle")
.attr("transform", function(d,i) { return "translate(45," + (elem_height / 2) + ")" ; });
...(更多代码添加额外的计划元素)......
dayData.exit().remove();
通过实验添加
d3.selectAll(".titleDay").remove();
到重绘函数的开头会暂时删除第一个元素,但之后会立即重新添加。
示例数据结构(7个对象的数组,每个对象都有日期名称,编号和可用资源列表):
[
{
"day_number": "1",
"day_name": "Sunday",
"resources": [
{
"resource_id": "OR01",
"resource_name": "OR 01",
...
答案 0 :(得分:1)
看起来你正试图使用关键功能来过滤数据 - 这不是它的作用。你可能想要像
这样的东西.data(struct.filter(function(d) { return day === "All" || d.day_number === day; }),
function(d) { return d.day_number; })
这将根据您指定的条件过滤数据,然后按day_number
进行匹配。