来自 JSON 的 D3 节点和链接,其中包含嵌套的子数组
D3 nodes and links from JSON with nested arrays of children
我有一个看起来像这样的JSON文件:
{
Object: {
children: Array[4]
...
Object: {
children: Array[1]
Object: {
children: Array[3]
...
},
Object: {
children: Array[1]
...
},
...
}
...
}
数组是一堆对象,这些对象具有子项数组,这些子项数组包含几级深的子项数组。
我的问题是,当我尝试将其转换为一组节点和链接以用于 d3 力布局时,我无法使其正确显示。我尝试使用 array.map 或 forEach 递归浏览所有对象并自己创建链接,但这似乎过于乏味。
有没有更简单的方法可以让这些数据准备好显示在部队布局中?我错过了什么?
您可能
希望在 D3.js 中使用 Reingold-Tilford 树,而不是强制导向布局。这样,您的数据已经采用正确的格式,并且布局也可以更好地工作。
如果您确实想要使用真正的强制导向布局,则必须将数据重写为 D3 期望的nodes
和links
格式。无论如何,这是网络图的标准逻辑结构。
我找到了一个包含我需要的代码的示例。此函数平展数据。它在Coffeescript中,因为这是我使用的。
flatten: (root) =>
nodes = []
i = 0
recurse = (node) =>
if node.children
node.size = node.children.reduce(
(p, v) -> p + recurse(v)
, 0)
if !node.id
node.id = ++i
nodes.push(node)
node.size
root.size = recurse(root)
nodes
完成此操作后,我可以运行tree.layout().links()来生成链接,而无需手动操作。
@nodes = @flatten(@root)
@links = d3.layout.tree().links(@nodes)
希望对某人有所帮助,因为这没有记录在文档或维基中。
javascript 函数将是:
function flatten(root) {
var nodes = [], i = 0;
function recurse(node) {
if (node.children)
node.size = node.children.reduce(function(p, v) { return p + recurse(v); }, 0);
if (!node.id)
node.id = ++i;
nodes.push(node);
return node.size;
}
root.size = recurse(root);
return nodes;
}
相关文章:
- 返回嵌套JSON中包含特定键的所有值
- Chai深度包含了对嵌套对象的断言
- 访问键中包含空格的嵌套属性
- 如何访问嵌套的表单ng包含范围/字段
- 嵌套ng包含的角度问题
- 如何选择包含已定义属性的嵌套对象
- AngularJS - 包含嵌套属性指令的内容
- gulp文件包含和翡翠嵌套问题
- jQuery - 单击包含
- 下拉菜单的嵌套文本字段悬停
- 使用 AngularJS 对包含@attributes的嵌套 JSON 数据进行排序
- 嵌套的 ng-重复包含数组的对象数组
- 检查嵌套的 JSON 结构是否包含键
- if语句中的中断语句,该语句包含在嵌套的for循环中
- 触发器成功处理程序已完成执行,其中包含嵌套的 ajax 请求
- Parse.com:在复合 query.or() 中包含嵌套指针
- 在将查询的结果传递到模板时,如何包含嵌套的Parse对象
- 当表包含嵌套表时,选择表中某一级别上的所有td's
- Pug/Jade - input是一个自闭合元素:,但包含嵌套内容
- 来自 JSON 的 D3 节点和链接,其中包含嵌套的子数组
- 如何防止jQuery Selector包含嵌套元素