2013-05-31 62 views
0

我正尝试从可编辑的treepanel生成JSON。我能够生成JSON,但希望JSON只有某些字段。如何从TreePanel生成自定义JSON

以下是我如何通过遍历生成JSON。

function getNodeList(bfsQueue) { 
     var node = bfsQueue.pop(); 
     var nodeQueue = []; 

     for (var ii = 0; ii < node.childNodes.length; ii++) { 
      bfsQueue.push(node.childNodes[ii]); 
      nodeQueue.push(node.childNodes[ii]); 
     } 
     if (bfsQueue.length === 0) { 
      return nodeQueue; 
     } else { 
      return nodeQueue.concat(getNodeList(bfsQueue)); 
     } 
    } 

这就是我在我的提交处理函数中调用函数的地方。

var startQueue = []; 
          var nodeList = []; 
          startQueue.push(tree.getRootNode()); 
          nodeList.push(tree.getRootNode()); 
          nodeList = nodeList.concat(getNodeList(startQueue)); 
          console.dir(nodeList); 
          for (var nn = nodeList.length-1; nn >= 0; nn--) { 
           var params = []; 
           for (var pp in nodeList[nn].data) { 
            if (pp === "children" || pp === "loader") {continue;} 
            params.push('"' + pp + '":' + JSON.stringify(nodeList[nn].data[pp]) + ''); 
           } 
           if (nodeList[nn].childNodes.length > 0) { 
            var childList = []; 
            for (var ii = 0; ii < nodeList[nn].childNodes.length; ii++) { 
             childList.push(nodeList[nn].childNodes[ii].json); 
            } 
            params.push('"children": [' + childList.join(',') + ']'); 
           } 
           nodeList[nn].json = "{" + params.join(",") + "}"; 
          } 
          alert("My Root :"+nodeList[0].json); 

生成的JSON就是这个。

{ 
"text": "Src", 
"id": "src", 
"expandable": true, 
"expanded": true, 
"allowDrag": false, 
"parentId": null, 
"root": true, 
"leaf": "", 
"depth": 0, 
"index": 0, 
"checked": null, 
"cls": null, 
"iconCls": null, 
"isLast": true, 
"isFirst": true, 
"allowDrop": true, 
"loaded": true, 
"loading": false, 
"href": null, 
"hrefTarget": null, 
"qtip": null, 
"qtitle": null, 
"children": [ 
    { 
     "text": "United Kingdom", 
     "id": "United Kingdom", 
     "parentId": "src", 
     "root": "", 
     "leaf": "", 
     "depth": 1, 
     "index": 0, 
     "expanded": false, 
     "expandable": true, 
     "checked": null, 
     "cls": "", 
     "iconCls": "", 
     "isLast": true, 
     "isFirst": true, 
     "allowDrop": true, 
     "allowDrag": true, 
     "loaded": true, 
     "loading": false, 
     "href": "", 
     "hrefTarget": "", 
     "qtip": "", 
     "qtitle": "", 
     "children": [ 
      { 
       "text": "London", 
       "id": "London", 
       "parentId": "United Kingdom", 
       "root": "", 
       "leaf": "", 
       "depth": 2, 
       "index": 0, 
       "expanded": false, 
       "expandable": true, 
       "checked": null, 
       "cls": "", 
       "iconCls": "", 
       "isLast": true, 
       "isFirst": true, 
       "allowDrop": true, 
       "allowDrag": true, 
       "loaded": false, 
       "loading": false, 
       "href": "", 
       "hrefTarget": "", 
       "qtip": "", 
       "qtitle": "" 
      } 
     ] 
    } 
] 

}

而且我需要它是这种格式。只有几个领域不是全部。

{ 
"text": "Src", 
"id": "src", 
"parentId": null, 
"root": true, 
"leaf": "", 
"depth": 0, 
"children": [ 
    { 
     "text": "United Kingdom", 
     "id": "United Kingdom", 
     "parentId": "src", 
     "root": "", 
     "leaf": "", 
     "depth": 1, 
     "children": [ 
      { 
       "text": "London", 
       "id": "London", 
       "parentId": "United Kingdom", 
       "root": "", 
       "leaf": "", 
       "depth": 2 
      } 
     ] 
    } 
] 

}

请帮助。提前致谢。

回答

0

只需在结果中选择你想要的字段。

例子:

function getNodeData(node, fields) { 
    var data = {}; 

    // loop through desired fields 
    Ext.each(fields, function(fieldName) { 
     data[fieldName] = node.get(fieldName); 
    }); 

    if (node.hasChildNodes()) { 
     var children = data.children = []; 
     node.eachChild(function(child) { 
      children.push(getNodeData(child, fields)); 
     }); 
    } 

    return data; 
} 

用法:

var fields = ['text', 'id', 'parentId', 'root', 'leaf', 'depth'], 
    nodeList = getNodeData(tree.getRootNode(), fields); 
+0

那么这并没有为我工作。现在它显示在警报中未定义。 – user2143272

+0

你已经注意到我没有使用与你相同的函数名称,对吧? – rixo

+0

我的坏...对不起!我当时请不理会以前的评论。我正在做一些非常愚蠢的事情。有效。非常感谢!是的,我注意到函数名称不同。 – user2143272