我有每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秒后的下一次数据获取中,数据很好,并且可视化效果正确。
数据本身始终是“格式正确的”,只是提供的值不正确。因此,即使在故障期间,也可以将数据绑定到元素上。
我想做的是,如果数据包含这些负值之一,则跳过整个迭代并更新阶段。
也许还值得注意的是,数据中的项目始终是相同的,也就是说,发生的唯一“输入”阶段是页面加载,并且没有项目退出(尽管我确实将这些操作包括在内)捕获数据中的任何意外波动)。这些项目的值确实会改变。
答案 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()
,但是您可以使用其他更新方法。