javascript - 即使一项中只有一项属性发生更改,我是否也必须重新加入整个数据集?

标签 javascript d3.js

我有一个相对较大的数据集(比如 10000+ 项)。 我已将此数据绑定(bind)到 D3 选择以生成项目视觉效果。

如果我在此数据集中的一项中仅更改了一个简单属性,则必须再次将整个相同的数据集重新加入到选择中。

container.selectAll(".item").data(dataset);

D3 中是否有任何 api 可以处理这个简单的更改,而不是重新加入整个相同的数据集?

最佳答案

简短回答:

您不必重新加入整个数据集,特别是当您有一个巨大的数据数组并且只有一个对象发生更改时。

您可以更改数据数组本身或更改 D3 选择中的数据,这并不重要...重要的是单独更改数据(使用这些方法中的任何一种)不会更改 datavis,而是它是一个 SVG、一个 Canvas ,甚至是一个纯 HTML 数据可视化。为此,您需要更新选择。

这是一个非常简单的演示,我们有一个包含 500 个对象的巨大数组:

const data = d3.range(500).map(function(d) {return {prop: true}});

并且,使用该数组,我们构建了一组 div。

假设我们更改单个对象:

data[100].prop = false;

数据已更改,但要更改可视化效果,我们必须更改选择(即代码中的 div)。在演示中,选区在 1 秒后更新,第 100 个 div 将变为红色:

const data = d3.range(500).map(function(d) {
  return {
    prop: true
  }
});
const body = d3.select("body");
const divs = body.selectAll(null)
  .data(data)
  .enter()
  .append("div")
  .style("background-color", "white");
  
 divs.transition()
  .delay(function(_, i) {
    return i
  })
  .style("background-color", function(d) {
    return d.prop ? "green" : "red"
  })

data[100].prop = false;

d3.timeout(function() {
  divs.style("background-color", function(d) {
    return d.prop ? "green" : "red"
  });
}, 1000)
div {
  width: 10px;
  height: 10px;
  float: left;
  margin: 1px;
}
<script src="https://d3js.org/d3.v5.min.js"></script>

关于javascript - 即使一项中只有一项属性发生更改,我是否也必须重新加入整个数据集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52023820/

相关文章:

javascript - ionic 警报 - 检查结果是否未定义

javascript - 双击 Facebook 分享按钮

javascript - 在d3中,如何从SVG线中获取插值线数据?

Javascript 使用变量作为数组名

javascript - 创建最大体积的内切 3D 框,适合点数组

javascript - React 中如何判断哪个组件触发了事件处理器?

javascript - 使 svg 容器在数组循环中出现一个在另一个之下

javascript - 从 D3.js 的 JSON 获取数据

javascript - D3js 具有节点和链接的拖动行为

javascript - D3+Leaflet Circle SVG 元素不显示任何颜色