怎么将上面这种数据格式转成下面这种格式啊,tree结构

请教各位大lao

img

怎么将上面这种数据格式转成下面这种格式啊,tree结构

img

该回答引用GPTᴼᴾᴱᴺᴬᴵ
如果您的 pid 字段是无效的,那么可以使用以下方法将原始数据格式转换成树形结构:

function buildTree(data) {
  let map = {}, node, roots = [], i;
  for (i = 0; i < data.length; i += 1) {
    map[data[i].id] = i;
    data[i].children = [];
  }
  for (i = 0; i < data.length; i += 1) {
    node = data[i];
    if (node.pid !== 0) {
      data[map[node.pid]].children.push(node);
    } else {
      roots.push(node);
    }
  }
  return roots;
}


这个函数遍历输入数据数组两次。第一次遍历创建一个哈希表 map,它的键是每个节点的 id 值,值是该节点在数组中的索引。同时在每个节点上添加一个空数组 children,以便在第二次遍历时将它们添加为父节点的子节点。第二次遍历遍历数据数组,并将每个节点添加到它的父节点的 children 数组中,或者添加到根节点数组 roots 中,如果节点没有父节点。

调用这个函数可以将原始数据转换成树形结构:

let data = [
  { id: 1, name: 'Node 1', pid: 0 },
  { id: 2, name: 'Node 2', pid: 1 },
  { id: 3, name: 'Node 3', pid: 2 },
  { id: 4, name: 'Node 4', pid: 0 },
  { id: 5, name: 'Node 5', pid: 4 },
  { id: 6, name: 'Node 6', pid: 5 }
];

let tree = buildTree(data);
console.log(tree);


这将输出以下树形结构:

[  {    "id": 1,    "name": "Node 1",    "pid": 0,    "children": [      {        "id": 2,        "name": "Node 2",        "pid": 1,        "children": [          {            "id": 3,            "name": "Node 3",            "pid": 2,            "children": []
          }
        ]
      }
    ]
  },
  {
    "id": 4,
    "name": "Node 4",
    "pid": 0,
    "children": [
      {
        "id": 5,
        "name": "Node 5",
        "pid": 4,
        "children": [
          {
            "id": 6,
            "name": "Node 6",
            "pid": 5,
            "children": []
          }
        ]
      }
    ]
  }
]


可以参考下这两个方法

//方式一:  使用foreach转换
    public static List<TreeNode> buildTreeUseList(List<TreeNode> treeList,long id){
        List<TreeNode> children = new ArrayList<>();
        for (TreeNode treeNode : treeList) {
            if(treeNode.getPid() == id){
                //递归设置children节点
                treeNode.setChildren(buildTreeUseList(treeList, treeNode.getId()));
                //放入children集合
                children.add(treeNode);
            }
        }
        return children;
    }
  
    //方式二:  使用stream流转换
    public static List<TreeNode> buildTreeUseStream(List<TreeNode> treeList,long id){
        List<TreeNode> list = treeList.stream()
                .filter( treeNode -> treeNode.getPid().longValue() == id )
                .map( treeNode -> {
                    treeNode.setChildren(buildTreeUseStream(treeList,treeNode.getId()));
                    return treeNode;
                })
                .collect(Collectors.toList());
        return list;
    }

hutool的TreeUtil加上TreeNodeConfig 可以实现