如何理解这段代码,如何生成tree型结构的

 function createTree(deep) {
            let children = {};
            let tree = { id: 0 ,children};
            for (let i = 1; i <= deep; i++) {
                children.id = i;
                children.children = {}
                children = children.children; //不太理解这里
            }
            return tree;
        }
        let tree = createTree(6);

看他每次循环都只生成了一个节点,怎么把他遍历到tree中的呢?

children = children.children;
遍历到下一层

这段代码实现了创建一棵指定深度 deep 的树,并返回树的根节点。

可以理解为,代码中的 children 变量实际上是一个指向当前节点的指针,每次循环执行时都将其指向当前节点的子节点,并在子节点创建一个新的空 children 对象,从而实现了向下“延伸”树节点的效果。而因为每个节点都包含其子节点的引用,因此在根节点处访问整棵树时,可以通过节点之间的引用关系轻易地遍历整个树。

可以画一张图来更好的理解。举个例子,假设深度为 3,那么最终的树形结构长这样:

  1
 / \
2   3
   / \
  4   5

在代码执行过程中,变量的变化如下:

循环次数childrentree
1{}{ id: 0, children: {} }
2{ id: 1, children: {} }{ id: 0, children: { id: 1, children: {} } }
3{ id: 2, children: {} }{ id: 0, children: { id: 1, children: { id: 2, children: {} } } }
4{}{ id: 0, children: { id: 1, children: { id: 2, children: {}}}}
5{ id: 4, children: {} }{ id: 0, children: { id: 1, children: { id: 2, children: { id: 4, children: {} }}}}
6{ id: 5, children: {} }{ id: 0, children: { id: 1, children: { id: 2, children: { id: 4, children: {}, id: 5, children: {} }}}}

可以看到,在每次循环中,变量 children 都指向当前节点,并逐步“延伸”到下一层节点。最后在根节点处将整个树返回。

每次到children = children.children,children重新赋值,children代表的是children.children位置的数据,及children指向children.children

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/730920
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:异步返回的tree展开节点不生效,解决办法原来如此这么简单
  • 除此之外, 这篇博客: Tree组件实现文件目录——基础实现中的 一.准备阶段 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    {
        path: '/',
        alias: '/homee',
        name: 'Home',
        component: Layout,
        children: [
          {
            path: 'folder_tree',
            component: () => import('@/views/folder-tree/folder-tree.vue')
          }
        ]
      }
    
    export const getFolderList = () => {
      return axios.request({
        url: '/getFolderList',
        method: 'get'
      })
    }
    
    export const getFileList = () => {
      return axios.request({
        url: '/getFileList',
        method: 'get'
      })
    }
    
    //文件数据
    export const getFileList = () => {
      const template = {
        'name|5': '@cword',
        'creat_time': '@datetime',
        'folder_id|1-5': 0,
        'id|+1': 10000
      }
      let arr = []
      doCustomTimes(10, () => {
        arr.push(Mock.mock(template))
      })
      return arr
    }
    
    //文件夹数据
    export const getFolderList = () => {
      const template1 = {
        'name|1': '@word',
        'creat_time': '@datetime',
        'folder_id': 0,
        'id|+1': 1
      }
      const template2 = {
        'name|1': '@word',
        'creat_time': '@datetime',
        'folder_id': 1,
        'id|+1': 4
      }
      let arr = []
      doCustomTimes(3, () => {
        arr.push(Mock.mock(template1))
      })
      doCustomTimes(2, () => {
        arr.push(Mock.mock(template2))
      })
      return arr
    }
    
    
    import Mock from 'mockjs'
    // import { getUserInfo, login, authorization } from './response/user'
    import { getTableData, getFileList, getFolderList } from './response/data'
    // const Random = Mock.Random
    
    // Mock.mock(/\/getUserInfo/, 'post', getUserInfo)
    // Mock.mock(/\/login/, 'post', login)
    // Mock.mock(/\/authorization/, 'get', authorization)
    Mock.mock(/\/getTableData/, 'get', getTableData)
    Mock.mock(/\/getFileList/, 'get', getFileList)
    Mock.mock(/\/getFolderList/, 'get', getFolderList)
    
    // Mock.setup({
    //   timeout: 0
    // })
    
    // Random.extend({
    //   fruit () {
    //     const fruit = ['apple', 'peach', 'lemon']
    //     return this.pick(fruit)
    //   }
    // })
    
    export default Mock
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^