我是d3和javascript的新手,很抱歉,如果这是一个愚蠢的问题。我在使用d3力布局时遇到了麻烦。我可以使用数据填充“节点”,但我无法弄清楚如何编写以"links": [
{"source": 0, "target": 1},
我试着写一个循环,但是它不起作用,目标有“weight:NaN”,因为我引用了父节点和与父节点同名的节点,我猜:
d3.json('file.json',function(data){
var nodes = data;
var links = [];
for (var i = 0; i < data.length; i++) {
for (var j = 0; j < data[i].parents.length; j++) {
links.push({"source": i, "target": data[i].parents[j]})
}
}
我的json文件看起来像这样,我必须用相应的父连接所有对象(更改json文件不是不是选项):
[
{
"name": "name 1",
"parents": [
{"name": "name 5"},
{"name": "name 4"}
]
},
{
"name": "name 2",
"parents": [
{"name": "name 1"},
{"name": "name 3"}
]
},...
]
我希望有人可以帮助并向我解释如何正确编写此功能。 谢谢。苏珊
答案 0 :(得分:0)
传递给force.nodes()
的参数必须是数组。然后,您将看到传递给force.links()
的参数也必须是一个数组,并且该数组的每个元素必须是形式中的对象
{"source": source_index, "target": target_index}
(正如您在代码中所做的那样),其中source_index
和target_index
是节点数组中对应节点的索引(传递给force.nodes()
)(这就是您的错误所在)。
因此,如果您查看代码,您将看到您没有在links数组中传递正确的值。您需要找到使用来自nodes数组的正确索引填充链接数组的方法(假设将“name 5”转换为适当的索引,我相信它将为4,在您的情况下,假设节点数组名称为“name 1”, “名称2”,名称3“等......)。