数据键功能过滤器始终返回第一个元素

时间:2015-08-05 18:15:42

标签: javascript jquery json d3.js

短版本:绑定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",
    ...

1 个答案:

答案 0 :(得分:1)

看起来你正试图使用​​关键功能来过滤数据 - 这不是它的作用。你可能想要像

这样的东西
.data(struct.filter(function(d) { return day === "All" || d.day_number === day; }),
      function(d) { return d.day_number; })

这将根据您指定的条件过滤数据,然后按day_number进行匹配。