了解D3.js如何将数据绑定到节点

Ric*_*ard 69 javascript html-table d3.js

我正在阅读D3.js文档,并且发现很难从文档中理解selection.data方法.

这是文档中给出的示例代码:

var matrix = [
  [11975,  5871, 8916, 2868],
  [ 1951, 10048, 2060, 6171],
  [ 8010, 16145, 8090, 8045],
  [ 1013,   990,  940, 6907]
];

var tr = d3.select("body").append("table").selectAll("tr")
    .data(matrix)
  .enter().append("tr");

var td = tr.selectAll("td")
    .data(function(d) { return d; })
  .enter().append("td")
    .text(function(d) { return d; });
Run Code Online (Sandbox Code Playgroud)

我理解大部分内容,但声明.data(function(d) { return d; })部分的内容是var td什么?

我最好的猜测如下:

  • var tr语句已将四元素数组绑定到每个tr节点
  • var td语句然后使用该四元件阵列作为其数据,以某种方式

.data(function(d) { return d; })实际上如何获得这些数据,以及它返回了什么?

Phr*_*ogz 65

当你写:

….data(someArray).enter().append('foo');
Run Code Online (Sandbox Code Playgroud)

D3创建了一堆<foo>元素,一个用于数组中的每个条目.更重要的是,它还将数组中每个条目的数据与该DOM元素相关联,作为__data__属性.

试试这个:

var data = [ {msg:"Hello",cats:42}, {msg:"World",cats:17} ]; 
d3.select("body").selectAll("q").data(data).enter().append("q");
console.log( document.querySelector('q').__data__ );
Run Code Online (Sandbox Code Playgroud)

你将看到的(在控制台中)是对象{msg:"Hello",cats:42},因为它与第一个创建的q元素相关联.

如果你以后做:

d3.selectAll('q').data(function(d){
  // stuff
});
Run Code Online (Sandbox Code Playgroud)

d结果是该__data__财产的价值.(此时,您可以确保// stuff使用返回新数组值的代码进行替换.)

这是另一个示例,显示绑定到HTML元素的数据以及在较低元素上重新绑定数据子集的能力:

  没有说明

  • +1分享D3.js游乐场!不错的工具! (2认同)

all*_*kim 19

理解这段代码的作用的关键是要认识到选择是DOM元素数组的数组.最外面的数组称为"选择",内部数组称为"组",这些组包含DOM元素.您可以通过进入d3js.org的控制台并进行d3.selectAll('p')之类的选择来测试它,您将看到一个包含包含'p'元素的数组的数组.

在您的示例中,当您第一次调用selectAll('tr')时,您将获得一个包含所有'tr'元素的单个组的选择.然后每个元素matrix与每个'tr'元素匹配.

但是当你在该选择上调用selectAll('td')时,选择已经包含一组'tr'元素.这一次,每个元素都将成为一组 'td'元素.组只是一个数组,但它也有一个引用旧选择的parentNode属性,在本例中是'tr'元素.

现在,当您调用data(function(d) { return d; })这个新选择的'td'元素时,d表示绑定到每个组的父节点的数据.所以在这个例子中,第一组中的'td'将与数组[11975,5871,8916,2868]绑定.第二组'td'与[1951,10048,2060,6171]绑定.

你可以在这里阅读mike bostock自己对选择和数据绑定的出色解释:http://bost.ocks.org/mike/selection/

  • 虽然 Phrogz 的评论有一些很好的信息并且非常有用,但这个答案清楚地解释了 **exact** 提出的问题。我也有同样的困惑,当我看到 `return d;` 返回 **parent** 节点的部分时,它点击了。令人困惑的是,某些方法在不同的层次上起作用。例如,`attr` 作用于单个元素,与 `data` 不同。谢谢! (2认同)