所以我一直在使用 d3 的缩放圈(http://mbostock.github.com/d3/talk/20111116/pack-hierarchy.html):
数据作为 json 数组传递给 d3 脚本,其中包含几个不同级别的数组和对象。
object = {
class: "show",
name: "Game of Thrones",
children : [
{
class: "family",
name: "Starks",
children: [
{
class: "members",
name: "Rob"
},
{
class: "members",
name: "Jon Snow"
}
],
},
{
class: "family",
name: "Lannisters"
children: [
{
class: "members",
name: "Ser Jaime"
},
{
class: "members",
name: "Cersei"
}
],
}
],
}
显示圆圈没有问题。我现在正在尝试在映射数据层次结构的一侧创建导航显示。理想情况下,我想要的是这样的:
<ul>
<li> Game of Thrones
<ul>
<li> Starks
<ul>
<li> Rob </li>
<li> Jon Snow </li>
</ul>
</li>
<li> Lannisters
<ul>
<li> Ser Jaime </li>
<li> Cersei </li>
</ul>
</li>
</ul>
</li>
</ul>
这是一个基本的列表结构。我唯一能做的就是访问数据中的 1 级。我使用'divs' 来尝试首先降低结构。
var sentimentData = data.children;
var navBox = d3.select("body").append("body:div");
navBox
.attr("class", "navBox");
var sentimentNav = navBox.selectAll('div')
.data(sentimentData)
.enter()
.append('div')
.text(function(d){ return d.name; });
我已经无法继续超过那个级别了。我在想递归方式可能是最好的方式。我在下面尝试了这个函数,但它只是将 div 附加到顶部 div 而不是父节点。
function buildNav(d) {
if (d.children) {
children = d.children;
d3.select('body').append('div')
.data(children)
.enter()
.append('div')
.attr("class", function(d) {return d.name; });
children.forEach(buildNav);
d._children = d.children;
d.children = null;
}
}
buildNav(data);
任何关于如何将孩子附加到他们的父母,或如何访问多个级别的数据的建议将不胜感激。