繁体   English   中英

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

[英]Appending nodes to a nested Javascript Object in recursive manner

我有一个嵌套的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": {}
        }
    };

在我的实际程序中,每当我在html页面中绘制一个div ,我都会为该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
                }

            }

        };

谁能帮我完成以上功能?

以下功能可用于创建每个节点

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将孩子添加到每个节点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM