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

标签 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": {}
        }
    };

在我的实际程序中,每当我在我的 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 将子节点添加到每个节点。

关于javascript - 以递归方式将节点附加到嵌套的 Javascript 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34117674/

相关文章:

python - 查找具有给定总和的数字列表的所有组合

algorithm - 增量检测 DAG 中的支配者

Android Activity 返回导航递归循环问题

javascript - 选择单选按钮时删除禁用属性

javascript - 如何在daterangepicker中设置默认日期?

c# - 复杂路径

list - 如何在没有 map 的情况下在 Lisp 中创建子列表列表?

python - 如何管理 python turtle 中的事件处理程序递归?

javascript - 从简单的 js 代码调用 angularjs 服务

javascript - getDate 返回错误值