2015-12-06 27 views
1

我有一個嵌套的javascript對象,我將其用作圖形。我的圖中的每個節點都有一個靜態結構。每個節點有兩種類型的子節點true/false。他們可以有許多與其關聯的子節點(不是二叉樹)。以遞歸的方式將節點附加到嵌套的Javascript對象

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我創建該專區的節點。 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

以下功能可用於創建每個節點

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孩子添加到每個節點。

+0

由於問題被標記爲'javascript'而不是'jquery',您應該解釋'$ .extend()'函數的作用,或者使用純js替代方法。 – m69