我有一个嵌套的javascript对象,我将其用作图形。我的图中的每个节点都有一个静态结构。每个节点都有两种类型的子节点true/false
。并且它们可以有许多与之关联的子节点(不是二叉树)。
var directedGraph = {
"sms_in": {
"metaType": "",
"data": {"parents": [], "args": {"values": {}, "keys": []}, "return": ["message", "address"]},
"true": {
"A": {
"metaType": "",
"data": {"parents": [], "args": {"values": {}, "keys": []}, "return": ["message", "address"]},
"true": {
"C": {
"metaType": "",
"data": {
"parents": [],
"args": {"values": {}, "keys": []},
"return": ["message", "address"]
},
"true": {},
"false": {},
"prototype": {}
}
},
"false": {
"B": {
"metaType": "",
"data": {
"parents": [],
"args": {"values": {}, "keys": []},
"return": ["message", "address"]
},
"true": {},
"false": {},
"prototype": {}
}
},
"prototype": {}
}
},
"false": {},
"prototype": {}
}
};
在我的实际程序中,每当我在div
页面中绘制html
时,我都会为该div创建一个节点。 Id将以动态方式生成(在上面的示例中,我使用了A,B,C)。
这就是为什么我需要一种以递归方式向图表添加节点的方法。
var pushNodeById = function (parentId, bool, childId, childNode) {
for(key in directedGraph){
if(key == parentId){
directedGraph[parentId][bool][childId] = childNode;
}else{
//make the recursive call
}
}
};
有谁可以帮我完成上述功能?
答案 0 :(得分:0)
以下功能可用于创建每个节点
var mapIds = {};
function Node(obj){
$.extend(this,obj);
this.true = {};
this.false = {};
this.addChild = function(id,prop,obj){
var temp = new Node(obj);
mapIds[id] = temp;
this[prop][id] = temp;
return temp;
}
this.addTrue=function(id,obj){
return this.addChild(id,"true",obj)
}
this.addFalse=function(id,obj){
return this.addChild(id,"false",obj)
}
this.getById = function(id){
return mapIds[id];
}
}
现在动态创建树
var tempObj = {whatever:{}};
var tree = new Node(tempObj);
var A = tree.addTrue("A",tempObj)
A
.addTrue("B",tempObj)
.addTrue("G",tempObj);
A
.addTrue("C",tempObj);
var D = A.addTrue("D",tempObj);
D.addFalse("F",tempObj);
D.addTrue("E",tempObj);
//Now Add to C -->False -> H,I, K
var C = tree.getById("C");
C.addFalse("H",tempObj)
C.addFalse("I",tempObj)
C.addFalse("K",tempObj)
JSON.stringify(tree);
您可以使用 getById 为每个节点添加子项。