从平面阵列构建层次结构,同时从不需要的节点提升子节点

时间:2017-10-26 15:46:23

标签: javascript typescript ecmascript-6

具有创建层次结构的功能,但需要一种有效的方法来构建它,同时删除不需要的节点并将其子节点提升为有效的父节点。

http://jsfiddle.net/zx1scvbf

注意:父节点将始终显示在数组中的子节点之前。

Node { id: string, parentNodeId: string, flag: boolean, children: Node[] }; 


function buildTree(nodes) {
    var tree;
    var childrenOf = new Map();
    nodes.forEach(node => {
        if (!childrenOf.has(node.id)) {
            childrenOf.set(node.id, []);
        }
        node.childNodes = childrenOf.get(node.id);
        if (node.parentId != null) {
            childrenOf.has(node.parentId) ?
                childrenOf.get(node.parentId).push(node) : childrenOf.set(node.parentId, [node]);
        } else {
            tree = node;
        }
    });
    return tree;
}

当标志为真时删除节点,在jsfiddle json中,需要删除node.id 1和2,同时将3作为子节点提升到节点0.当标志为真时,上面的函数不会删除,它只是构建层次结构。

小提琴中示例的预期输出:

   {  
   "id":"0",
   "parentId":null,
   "children":null,
   "flag":"false",
   "childNodes":[  
      {  
         "id":"3",
         "parentId":"2",
         "children":null,
         "flag":"false",
         "childNodes":[  
            {  
               "id":"4",
               "parentId":"3",
               "children":null,
               "flag":"false",
               "childNodes":[  

               ]
            },
            {  
               "id":"5",
               "parentId":"3",
               "children":null,
               "flag":"false",
               "childNodes":[  

               ]
            }
         ]
      },
      {  
         "id":"6",
         "parentId":"0",
         "children":null,
         "flag":"false",
         "childNodes":[  

         ]
      }
   ]
}

1 个答案:

答案 0 :(得分:0)

这是基于递归调用的javascript方法(无限深度的“育儿”),它可以很容易地应用于打字稿项目:

const buildTreeHierarchy = (nodes, perentId) => {
    const result = nodes
      .filter(n => n.parentId === perentId && n.flag !== 'true')
      .map(n => ({...n, children: buildTreeHierarchy(nodes, n.id)}));
    return result.length ? result : null;
}

buildTreeHierarchy(example, null);

example参数是您的初始JSON数组。