本题可以和JS的40题,虚拟DOM配合着记忆,是互逆的过程。

function dom2json() {
    const jsContainer = document.getElementById('jsContainer');
    return createObj(jsContainer);
}

function createObj(element) {
    // 0. 创建一个空的对象
    const obj = {};
    // 1. 获得标签名,nodeName可以获得text标签(里面好多回车),typeName获得是标签
    obj.tag = element.nodeName.toLowerCase().replace('#', '');
    // 2.如果是文本,有content属性,通过element.data来获得内容
    if (obj.tag == 'text') {
        obj.content = element.data.trim();
    }
    // 3.attributes初始化,如果有,那么逐个添加attributes
    obj.attributes = {};
    if (element.attributes) {
        for (let i = 0; i < element.attributes.length; i++) {
            const { name, value } = element.attributes[i];
            obj.attributes[name] = value;
        }
    }
    // 4.0对孩子数组过滤,去除没有内容的text
    const childArr = Array.from(element.childNodes).filter((item) => {
        return item.nodeName === '#text' && item.data.trim() !== '' || item.nodeName !== '#text';
    });
    // 4.1如果有孩子,那么递归调用自己,添加第i个数组元素
    obj.children = [];
    if (childArr.length) {
        for (let i = 0; i < childArr.length; i++) {
            obj.children[i] = createObj(childArr[i]);
        }
    }

    return obj;
}