2013-05-31 3 views
0

Я пытаюсь создать JSON из редактируемой панели дерева. Я могу генерировать JSON, но хотел бы, чтобы JSON имел только определенные поля.Как создать пользовательский JSON из TreePanel

Вот как я генерирую 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

My Bad ... Извините! Я был проигнорирован предыдущим комментарием. Я делал что-то действительно глупое. Это сработало. Большое спасибо! Да, я заметил, что имя функции отличается. – user2143272