以递归方式将节点附加到嵌套的Javascript对象

时间:2015-12-06 12:59:17

标签: javascript algorithm recursion

我有一个嵌套的javascript对象,我将其用作图形。我的图中的每个节点都有一个静态结构。每个节点都有两种类型的子节点true/false。并且它们可以有许多与之关联的子节点(不是二叉树)。

enter image description here

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
                }

            }

        };

有谁可以帮我完成上述功能?

1 个答案:

答案 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 为每个节点添加子项。