我正在使用 d3.js 将动物(有机体)家族(一次最多 4000 个)可视化为树形图,尽管数据源也可以是目录列表或命名空间对象列表。我的数据看起来像:
json = {
organisms:[
{name: 'Hemiptera.Miridae.Kanakamiris'},
{name: 'Hemiptera.Miridae.Neophloeobia.incisa'},
{name: 'Lepidoptera.Nymphalidae.Ephinephile.rawnsleyi'},
... etc ...
]
}
我的问题是:我正在尝试找到将上述数据转换为分层父/子数据结构的最佳方法,这些数据结构被许多 d3 可视化(例如树形图)使用(例如,请参阅d3/ 中的flare.json )示例/数据/目录)。这是所需数据结构的示例:
{"name": "ROOT",
"children": [
{"name": "Hemiptera",
"children": [
{"name": "Miridae",
"children": [
{"name": "Kanakamiris", "children":[]},
{"name": "Neophloeobia",
"children": [
{"name": "incisa", "children":[] }
]}
]}
]},
{"name": "Lepidoptera",
"children": [
{"name": "Nymphalidae",
"children": [
{"name": "Ephinephile",
"children": [
{"name": "rawnsleyi", "children":[] }
]}
]}
]}
]}
}
编辑:将所有原始所需的数据结构包含在一个ROOT
节点内,以符合只有一个主父节点的 d3 示例的结构。
我希望了解一般的设计模式,作为奖励,我很想在 javascript、php(甚至 python)中看到一些解决方案。javascript是我的偏好。关于 php:我实际使用的数据来自一个将结果编码为 json 的 php 脚本对数据库的调用。如果这对基于 php 的答案有任何用途,则 php 脚本中的数据库结果是一个有序数组(见下文)。
Array
(
[0] => Array
(
['Rank_Order'] => 'Hemiptera'
['Rank_Family'] => 'Miridae'
['Rank_Genus'] => 'Kanakamiris'
['Rank_Species'] => ''
) ........
其中:
'Rank_Order'
isParentOf 'Rank_Family'
isParentOf 'Rank_Genus'
isParentOf'Rank_Species'
我在这里问了一个关于 php 解决方案的类似问题,但唯一的答案在我的服务器上不起作用,我不太明白发生了什么,所以我想从设计模式的角度提出这个问题,并包括参考到我在 javascript 和 d3.js 中的实际使用。