题解 | #dom节点转成json数据#

dom节点转成json数据

http://www.nowcoder.com/practice/0340a0c6d11d4aadba0aef86e6ae723f

本题可以和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;
}
全部评论

相关推荐

12-20 11:26
复旦大学 Java
点赞 评论 收藏
分享
专业嗎喽:个人信息名字太大,合到电话邮箱那一栏就行,有党员写过党,剩下其他全删,站空太大了 把实习经历丰富,放最前面,然后是个人评价,技能之类的,然后是学校信息。项目经历最后面,可以就选一个自己擅长的。 现在是学校不是92就扣分的,没必要放前面。 然后现在看重实习经历>竞赛经历(校园经历)>课程项目经历
点赞 评论 收藏
分享
评论
6
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务