gpt4 book ai didi

javascript - D3 - 访问嵌套数据以创建导航树

转载 作者:行者123 更新时间:2023-11-30 05:51:25 26 4
gpt4 key购买 nike

所以我一直在用d3的zoom circle(http://mbostock.github.com/d3/talk/20111116/pack-hierarchy.html):

enter image description here

数据以 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>

这是一个基本的列表结构。我唯一能做的就是访问数据中的下一层。我使用“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);

任何有关如何将子级附加到其父级或如何向下访问多个级别的数据的建议将不胜感激。

最佳答案

尼克!以下是创建您在问题中描述的列表的示例的完整代码:(可能有更好的代码来做同样的事情,但这段代码有效并产生 100% 的内容)(如果当然,这只是一个起点,你自然会进一步开发真正的导航)

index.html:

<!DOCTYPE html>
<html>
<head>
<title>Navigation</title>
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
<script src="script.js"></script>
</head>
<body onload="load()">
<h2>Navigation</h2>
<h4>(using D3.js-generated navigation items)</h4>
</body>
</html>

脚本.js:

function load(){
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" }
],
}
],
};

buildNav(null, object);

function buildNav(parent_ul, node){
var current_ul, current_li;
if(parent_ul == null)
parent_ul = d3.select("body").append("ul");
current_li = parent_ul.append("li").text(node.name);
if (node.children) {
current_ul = current_li.append("ul");
for (var i=0; i<node.children.length; i++) {
buildNav(current_ul, node.children[i]);
};
};
};
};

这会产生以下页面:

enter image description here

希望对您有所帮助。

如果您还有其他问题,请告诉我。

关于javascript - D3 - 访问嵌套数据以创建导航树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14627014/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com