V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
he2020
V2EX  ›  JavaScript

如何使用递归把一个并不复杂的数据转化成这样的 DOM 结构?

  •  
  •   he2020 · 2021-11-18 16:27:15 +08:00 · 719 次点击
    这是一个创建于 887 天前的主题,其中的信息可能已经有所发展或是发生改变。

    要动态地渲染导航菜单,其中每个对象都对应一个菜单项,菜单项可以有子菜单,子菜单也可以有子子菜单。这样的数组结构如何转化成以下的 DOM 结构:

    var data = [
      {title: 'menu 1'},
      {
        title: 'menu 2',
        children: [
          title: 'menu 2-1'
          children: [
            //
          ]
        ]
      }
    ]
    
    <div class='tree'>
      <div class='tree-node'>
        <span class='node-title'></span>
      </div>
      <div class='node-children'>
        <div class='tree-node'>
          ...
        </div>
      </div>
    </div>
    
    

    我的思路大概是这样的,不限层级、具有相似结构的数据可以用递归实现,但写着写着写到一半做不下去了。 有啥办法在 populateMenu 函数的大致框架下把功能实现吗?更好的做法是什么?有时候代码写到一半才发现不对劲,怎么避免这种情况呢?

    <div class='menu'></div>
    
    var container = document.querySelector('.menu')
    function populateMenu(tree) {
      for(var i = 0; i <tree.length; i) {
        var objItem = tree[i] //取出每一个对象
        var node = document.createElement('div')
        node.classList.add('tree-node')
        //...
    
        if(objItem.children) {
          populateMenu(objItem.children)
        }
      }
      
    }
    
    jifengg
        1
    jifengg  
       2021-11-19 09:17:57 +08:00   ❤️ 1
    因为你`populateMenu(objItem.children)`这里丢失了父级关系,把`node`作为父节点传进去
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   979 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:52 · PVG 05:52 · LAX 14:52 · JFK 17:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.