1. /*
    2. <div>
    3. <span>
    4. <a></a>
    5. </span>
    6. <span>
    7. <a></a>
    8. <a></a>
    9. </span>
    10. </div>
    11. 把上边dom结构转成下面的JSON格式
    12. {
    13. tag: 'DIV',
    14. children: [
    15. {
    16. tag: 'SPAN',
    17. children: [
    18. { tag: 'A', children: [] }
    19. ]
    20. },
    21. {
    22. tag: 'SPAN',
    23. children: [
    24. { tag: 'A', children: [] },
    25. { tag: 'A', children: [] }
    26. ]
    27. }
    28. ]
    29. }
    30. */
    31. // 递归
    32. function dom2Json(domTree) {
    33. const obj = {}
    34. obj.tag = domTree.tagName
    35. obj.children = []
    36. domTree.childNodes.forEach(node => {
    37. obj.children.push(dom2Json(node))
    38. })
    39. return obj
    40. }
    41. dom2Json(document.getElementById('root'))

    继续发问:若给定的不是DOM结构,而是HTML字符串,该如何转换成JSON?
    答:借鉴 Vue 模板编译原理,利用正则匹配 HTML 字符串,开始标签、结束标签、文本,解析完成后生成对应的 AST ,并且建立起父子关联,不断向前推进(advance)截取剩余字符串,直到 HTML 字符串解析完成。
    参考:鲨鱼Vue - 编译原理解析