从数据的Parent - Child表中创建3d友好的JSON
Create D3-friendly JSON out of Parent Child table of data
我试图建立一个基于父子关系划分出数据的D3可视化。
http://blog.luzid.com/2013/extending-the-d3-zoomable-sunburst-with-labels/在这些示例中使用的JSON遵循类似于以下的模式:
var flare = {
"name": "family",
"size": 2000,
"children": [{
"name": "kidWithoutKids",
"size": 100
}, {
"name": "kidWithKids",
"size": 1900,
"children": [{
"name": "grandkidWithoutKids",
"size": 100
}, {
"name": "grandkidWithKids",
"size": 1900,
"children": [...and so on...]
}]
}]
}
我需要做的是将一组表格数据转换为该格式的JSON对象。所以,我进来的数据(我不能改变)看起来像这样:
var arrayChildParent = [
[{"thisText":"family"},{"thisText":"-"},{"thisNum":2000}],
[{"thisText":"kidWithoutKids"},{"thisText":"family"},{"thisNum":100}],
[{"thisText":"kidWithKids"},{"thisText":"family"},{"thisNum":1900}],
[{"thisText":"grandkidWithoutKids"},{"thisText":"kidWithKids"},{"thisNum":100}],
[{"thisText":"grandkidWithKids"},{"thisText":"kidWithKids"},{"thisNum":1800}],
..... and so on
]
所以,你可以把它想象成一个Child | Parent | Size的表。显然,如果有这样一个函数就太好了:
var flare = createJSON(arrayChildParent);
数据可以以任何顺序进入,所以我一直在构建一个递归函数来循环遍历数据并创建JSON树,但有时我可以有一个父节点有一个尚未创建的父节点的子节点。我也试过先循环创建一个parent的索引或者parent的索引,但是很难管理。
现在,我想知道我是否走错了路。是否有一种更简单的方法可以简单地将我拥有的数组数据集加载到D3中以用于树形结构?
任何帮助都将非常感激。谢谢!
有一种方法可以做到这一点。
第一步是稍微清理一下数据,这样就足够明智了。您可以使用Array.map()
来遍历数据并使每个数据成为一个对象:
var cleanData = arrayChildParent.map(function(d) {
return {
name: d[0].thisText,
parent: d[1].thisText,
size: d[2].thisNum
};
});
那么你需要一个函数来找到parent
是给定name
的所有数据点,然后递归地找到它们的子数据点。这很容易通过将Array.filter()
与Array.map()
串联使用来实现:
function getChildren(name) {
return cleanData.filter(function(d) { return d.parent === name; })
.map(function(d) {
return {
name: d.name,
size: d.size,
children: getChildren(d.name)
};
})
}
你的flare
变量只是-
上调用getChildren
的第一个结果
var flare = getChildren('-')[0];
编辑:
或者,格式化为您在问题中提到的单个函数:
var flare = createJSON(arrayChildParent);
function createJSON(yuckyData) {
var happyData = yuckyData.map(function(d) {
return {
name: d[0].thisText,
parent: d[1].thisText,
size: d[2].thisNum
};
});
function getChildren(name) {
return happyData.filter(function(d) { return d.parent === name; })
.map(function(d) {
return {
name: d.name,
size: d.size,
children: getChildren(d.name)
};
});
}
return getChildren('-')[0];
}
相关文章:
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 为effect Composer创建GodRays效果过程
- 从javascript创建一个列表
- onkeyup无法动态创建多个文本区域
- 如何使用javascript从主svg对象动态创建svg视图框
- 如何访问声音管理器2创建的声音对象
- 我已经创建了一个jquery转盘,并使用if条件来运行和停止转盘
- Kendo:我该如何在树视图中创建一个递归的hieiarchy
- 在 AS3 和 HTML5 中创建 3D 条形图
- 3D 立方体创建和处理该多维数据集上的事件
- 创建一个真正的3D网站
- 从数据的Parent - Child表中创建3d友好的JSON
- 无法在WebGL中创建沿轴旋转的3D Koch
- 如何在fabric.js中创建3D预览?
- 使用CSS3创建3D图像效果
- 创建一个3D对象动画在html页面
- 如何在three.js中创建一个颜色选择器,这将允许用户改变Maya 3D模型中特定多边形的颜色
- 使用javascript, html5和css3创建3d旋转鼠标跟踪墙导航
- 三.js - 创建不受缩放和平移影响的 3D 文本
- 使用PhantomJS crowbar从本地web服务器上的网页中提取3d创建的SVG