/*<div><span><a></a></span><span><a></a><a></a></span></div>把上边dom结构转成下面的JSON格式{tag: 'DIV',children: [{tag: 'SPAN',children: [{ tag: 'A', children: [] }]},{tag: 'SPAN',children: [{ tag: 'A', children: [] },{ tag: 'A', children: [] }]}]}*/// 递归function dom2Json(domTree) {const obj = {}obj.tag = domTree.tagNameobj.children = []domTree.childNodes.forEach(node => {obj.children.push(dom2Json(node))})return obj}dom2Json(document.getElementById('root'))
继续发问:若给定的不是DOM结构,而是HTML字符串,该如何转换成JSON?
答:借鉴 Vue 模板编译原理,利用正则匹配 HTML 字符串,开始标签、结束标签、文本,解析完成后生成对应的 AST ,并且建立起父子关联,不断向前推进(advance)截取剩余字符串,直到 HTML 字符串解析完成。
参考:鲨鱼Vue - 编译原理解析
