javascript - D3 将更新选择限制为具有实际更改的条目?

标签 javascript d3.js

我正在使用 d3 将我通过 websockets 接收的数据显示为一个简单的 html 表格。到目前为止效果很好。 现在我需要可视化对该数据的更改,因此我想使用带有背景颜色的过渡或其他东西来直观地突出显示已更改的单元格。

这是我使用的代码:

var data = new d3.map({"In1": false, "Reg1": 0815});

data.set("In2", true);
data.set("Reg2", 4711);

var table = d3.select("#foo").append("table").attr("class", "table table-bordered table-striped");

var thead = table.append("thead");
thead.append("th").text("Test");

var tbody = table.append("tbody");

update(data.entries());

当我通过 websockets 接收到新数据时,我只需通过 data.set(key,value) 更新数据映射并调用更新函数:

function update(data) {
    var rows = tbody.selectAll("tr")
        .data(data);

    rows.exit().remove();
    rows.enter().append("tr");

    // create a cell in each row for each column
    var cells = rows.selectAll("td")
        .data(function (row) {
            return [row.key, row.value];
        });

    cells.enter().append("td");

    cells.text(function (d) { return d; });
    cells.transition().style('color', 'red').transition().style('color', 'green');
}

问题是更新选择似乎适用于所有元素,而不仅仅是那些值实际发生变化的元素(这是我希望的)。 这是我做错了什么,还是通常都是这样?如果是这样,我如何才能将转换仅应用于实际更改的元素?

编辑:创建了一个 jsfiddle ,您会看到所有表格单元格都是动画的,我只希望“Reg2”的值单元格是....

最佳答案

D3 没有为此提供任何开箱即用的东西,但一种方法是将旧数据与元素一起存储,然后在更新时将新旧数据进行比较以查看它是否已更改。这样,您可以过滤您的元素并将转换仅应用于数据已更改的元素:

cells.filter(function() { return this.__olddata__ != this.__data__; })
        .each(function() { this.__olddata__ = this.__data__; })
        .transition().style('color', 'red').transition().style('color', 'green');

完整演示 here .

关于javascript - D3 将更新选择限制为具有实际更改的条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26741298/

相关文章:

javascript - 如何画双圆?

javascript - 我想禁用 Firefox 和 IE 中的右键单击选项

javascript - 对象字面量中带有空格的属性名称

javascript - 防止 Rickshaw/D3 显示高于给定缩放级别的 x 轴标签

javascript - d3-js 的 Force-Directed Layout 是否支持图像作为节点?

javascript - d3.js 中日期的默认表示形式是什么?

javascript - 如何在 D3 折线图中正确添加填充到绘图区域?

javascript - 如何在 Javascript 提交前更改文本框名称

javascript - 如何让 Observable.flatMap 等待解析

javascript - javascript/jQuery 中函数定义的区别