/*
<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.tagName
obj.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 - 编译原理解析