在D3.js中的更新阶段之前检查数据的有效性

时间:2018-08-13 04:17:14

标签: javascript d3.js

我有每10秒钟更新一次的数据,我想在进行更新之前检查所有数据是否有效。我目前间歇性地收到虚假数据,其中一个值为负数。如果其中一个对象的值为负,那么我不信任整个集合,也不想更新任何元素。

理想情况下,我不想更新某些项目,然后在出现不正确的值时保释,而是在更新任何内容之前先确定整套设备是否完好

我不确定d3如何处理此问题,但是我已经尝试过了,而且似乎可行。但这似乎并不特别符合D3的优雅风格,所以我认为可能有一种正确,更好的方法。但是,也许不是吗?!

var dataValid = true;
abcItems.each(function (d, i) {
    if (0 > dd.Number1 - dd.Number2) dataValid = false;
});
if (dataValid) {
    abcItems.each(function (d, i) {
        // updating elements here
    });
} else {
    console.log("negative value occurred");
}

是否有更好的方法可以通过D3进行管理?

更多上下文:

数据(通过RESTful API提供的JSON)和可视化(条形图)每10秒更新一次。 API中的故障最多每小时大约导致每小时一次错误数据(有时并非一整天都发生)。毛刺的影响是,条形都发生了巨大变化,而每次迭代数据只应变化一到两个。在10秒后的下一次数据获取中,数据很好,并且可视化效果正确。

数据本身始终是“格式正确的”,只是提供的值不正确。因此,即使在故障期间,也可以将数据绑定到元素上。

我想做的是,如果数据包含这些负值之一,则跳过整个迭代并更新阶段。

也许还值得注意的是,数据中的项目始终是相同的,也就是说,发生的唯一“输入”阶段是页面加载,并且没有项目退出(尽管我确实将这些操作包括在内)捕获数据中的任何意外波动)。这些项目的值确实会改变。

1 个答案:

答案 0 :(得分:1)

看看代码,它似乎已经将数据集绑定到DOM元素abcItems.each(...)

当数据无效时,为什么不放弃更新功能。

d3.json("bar-tooltip.json", function(dataset) {

    if (!dataset.every(d => d.Number2 <= d.Number1)) return;

    // do the update of the graph

    });

该示例假定您从一个在每个更新间隔被调用的函数中调用d3.json(),但是您可以使用其他更新方法。