从json文件创建d3强制布局的链接

时间:2014-02-20 14:50:10

标签: javascript json d3.js force-layout

我是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"}
  ]
 },...
]

我希望有人可以帮助并向我解释如何正确编写此功能。 谢谢。苏珊

1 个答案:

答案 0 :(得分:0)

D3文档有点人为,恕我直言,它并没有强调许多特性和功能的足够关键部分。然而,你真的需要仔细阅读几次,并理解这两件:

传递给force.nodes()的参数必须是数组。然后,您将看到传递给force.links()的参数也必须是一个数组,并且该数组的每个元素必须是形式中的对象
{"source": source_index, "target": target_index}
(正如您在代码中所做的那样),其中source_indextarget_index是节点数组中对应节点的索引(传递给force.nodes())(这就是您的错误所在)。

因此,如果您查看代码,您将看到您没有在links数组中传递正确的值。您需要找到使用来自nodes数组的正确索引填充链接数组的方法(假设将“name 5”转换为适当的索引,我相信它将为4,在您的情况下,假设节点数组名称为“name 1”, “名称2”,名称3“等......)。