Javascript 接受D3布局树中的常规嵌套对象

Javascript 接受D3布局树中的常规嵌套对象,javascript,json,d3.js,tree,Javascript,Json,D3.js,Tree,我正在创建一个类似于的树,并尝试绑定我的自定义JSON对象。切换树节点的代码如下所示 function toggleAll(d) { if (d.children) { d.children.forEach(toggleAll); toggle(d); } } // Initialize the display to show a few nodes. root.children.forEach(toggleAll); toggle(ro

我正在创建一个类似于的树,并尝试绑定我的自定义JSON对象。切换树节点的代码如下所示

function toggleAll(d) {
    if (d.children) {
      d.children.forEach(toggleAll);
      toggle(d);
    }
  }

  // Initialize the display to show a few nodes.
  root.children.forEach(toggleAll);
  toggle(root.children[1]);

 // Toggle children.
 function toggle(d) {
  if (d.children) {
    d._children = d.children;
    d.children = null;
  } else {
    d.children = d._children;
    d._children = null;
  }
}
如您所见,
d
与它的
子属性紧密耦合-我试图重写此函数以接受JSON中的任何嵌套对象,以便它也可以被切换/扩展。然而,我还并没有任何运气(尝试过hasOwnProperty)。有什么想法吗

编辑:包括我的JSON结构:

{
"date": "10242013"
"id": 34534
"addr": "444 Little Lane"    
"department": {id: 13, addr: "555 ShoeHorse Road", name: "CTS",…}
"manager": {id: 454, addr: "444 Little Lane", name: "Bobby Johnson",…}
...

忽略类型错误的JSON^此对象可以有许多嵌套对象以及这些对象中的对象。我试图避免使用硬编码的解决方案,而是使用:accept all“方法。

我编写了代码,将自定义JSON转换为d3树布局所需的格式

var json={
“日期”:“10242013”,
“id”:“34534”,
“地址”:“444小巷”,
“部门”:{
“id”:13,
“地址”:“ShoeHorse路555号”,
“名称”:“CTS”,
“计算机”:{
“id”:56,
“名称”:“CT”
},
“电子学”:{
“id”:65,
“名称”:“EC”
}
},
“经理”:{
“id”:454,
“地址”:“444小巷”,
“姓名”:“鲍比·约翰逊”
}
};
函数convertJSON(对象){
for(对象中的变量键){
if(typeof(object[key])=“object”){
var obj=convertJSON(对象[key]);
obj.key=obj.name?obj.name:“”;
obj.name=key;
如果(!object[“children”])
对象[“子对象”]=[];
对象[“子对象”]。推送(obj);
删除对象[键];
}
}
返回对象;
}
json=convertJSON(json);
log(json);
var m=[20,120,20,120],
w=1280-m[1]-m[3],
h=800-m[0]-m[2],
i=0,
根;
var tree=d3.layout.tree()
.尺寸([h,w]);
var diagonal=d3.svg.diagonal()
.投影(功能(d){
返回[d.y,d.x];
});
var vis=d3.选择(#body”).追加(“svg:svg”)
.attr(“宽度”,w+m[1]+m[3])
.attr(“高度”,h+m[0]+m[2])
.append(“svg:g”)
.attr(“转换”、“平移”(+m[3]+”、“+m[0]+”));
root=json;
root.x0=h/2;
root.y0=0;
函数toggleAll(d){
如果(d.儿童){
d、 儿童。forEach(toggleAll);
切换(d);
}
}
//初始化显示以显示几个节点。
根。子。forEach(toggleAll);
更新(根);
函数更新(源){
var持续时间=d3.event&&d3.event.altKey?5000:500;
//计算新的树布局。
var nodes=tree.nodes(root.reverse();
//为固定深度进行规格化。
nodes.forEach(函数(d){
d、 y=d.深度*180;
});
//更新节点…
var node=vis.selectAll(“g.node”)
.数据(节点、功能(d){
返回d.id | |(d.id=++i);
});
//在父节点的上一个位置输入任何新节点。
var nodeEnter=node.enter().append(“svg:g”)
.attr(“类”、“节点”)
.attr(“转换”,函数(d){
返回“translate”(“+source.y0+”,“+source.x0+”);
})
.打开(“单击”,功能(d){
切换(d);
更新(d);
});
追加(“svg:circle”)
.attr(“r”,1e-6)
.样式(“填充”,功能(d){
返回d.#儿童?“淡蓝色”:“fff”;
});
追加(“svg:text”)
.attr(“x”,函数(d){
返回d.children | | d.| U儿童?-10:10;
})
.attr(“dy”,“.35em”)
.attr(“文本锚定”,函数(d){
返回d.children | d.| u children?“结束”:“开始”;
})
.文本(功能(d){
返回d.name;
})
.样式(“填充不透明度”,1e-6);
//将节点转换到其新位置。
var nodeUpdate=node.transition()
.持续时间(持续时间)
.attr(“转换”,函数(d){
返回“translate”(“+d.y+”,“+d.x+”);
});
节点更新。选择(“圆圈”)
.attr(“r”,4.5)
.样式(“填充”,功能(d){
返回d.#儿童?“淡蓝色”:“fff”;
});
nodeUpdate.select(“文本”)
.样式(“填充不透明度”,1);
//将退出节点转换到父节点的新位置。
var nodeExit=node.exit().transition()
.持续时间(持续时间)
.attr(“转换”,函数(d){
返回“translate”(“+source.y+”,“+source.x+”);
})
.remove();
nodeExit.select(“圆”)
.attr(“r”,1e-6);
nodeExit.select(“文本”)
.样式(“填充不透明度”,1e-6);
//更新链接…
var link=vis.selectAll(“path.link”)
.数据(树.链接(节点)、函数(d){
返回d.target.id;
});
//在父对象的上一个位置输入任何新链接。
link.enter().insert(“svg:path”,“g”)
.attr(“类”、“链接”)
.attr(“d”,函数(d){
变量o={
x:source.x0,
y:source.y0
};
返回对角线({
资料来源:o,
目标:o
});
})
.transition()
.持续时间(持续时间)
.attr(“d”,对角线);
//过渡链接到他们的新位置。
link.transition()
.持续时间(持续时间)
.attr(“d”,对角线);
//将退出节点转换到父节点的新位置。
link.exit().transition()
.持续时间(持续时间)
.attr(“d”,函数(d){
变量o={
x:source.x,
y:来源,y
};
返回对角线({
资料来源:o,
目标:o
});
})
.remove();
//将旧位置隐藏起来,以便过渡。
nodes.forEach(函数(d){
d、 x0=d.x;
d、 y0=d.y;
});
}
//切换儿童。
功能切换(d){
如果(d.儿童){
d、 _children=d.children;
d、 children=null;
}否则{
d、 儿童=d.\U儿童;
d、 _children=null;
}
}
。节点圆{
光标:指针;
填充:#fff;
笔画:钢蓝;
笔划宽度:1.5px;
}
.节点文本{
字体大小:11px;
}
路径链接{
填充:无;
冲程:#ccc;
笔划宽度:1.5px;
}

d3.layout.tree
单击或选项单击以展开或折叠

你的JSON结构是什么?你能把它也放进去吗up@Cyril添加了JSONOk我建议的一件事是将嵌套的JSON转换成简单的格式,您需要编写一个转换器…现在您需要一个通用的解决方案