前端面试题之将自定义数据结构转化成DOM元素

题目描述:

如下图所示:给你一个嵌套的dom数据结构,如何将它转化成jsx的dom元素;

输入:

javascript 复制代码
const data = { 
 tagName: 'ul', 
 props: {'class': 'list'}, 
 children: [ 
  {tagName: 'li', children: ['douyin']},
  {tagName: 'li', children: ['toutiao']},
  {
    tagName: 'li', 
    children: [
        {
            tagName: 'span',
            props: { 'class': 'span' },
            text: 'meituan'
        },
    ]
  },
 ]
};

输出:

html 复制代码
<ul class="list">
 <li>douyin</li>
 <li>toutiao</li>
 <li>
    <span>meituan</span>
 </li>
</ul>

解题思路:

1.解读data数据结构,里面有tagName属性,我们可以使用document.createElement来创建html标签,并且复制给根元素element;

2.针对children属性,因为内部属性和父元素的属性是一样的,所以此处使用递归来调用函数即可

3.data数据显示文本有string、text属性两种格式;需要将这两种格式转化成节点类型的元素,方便使用appendChild将其放入到根元素element;

具体代码如下:

javascript 复制代码
<script>
    /**
    * 将自定义数据结构转换为DOM元素
    * @param {Object} node - 包含标签名、属性和子节点的数据对象
    * @returns {HTMLElement} 生成的DOM元素
    */
    function createDOMElement(node) {
        // 处理非对象类型(如文本节点)
        if (typeof node === 'string') {
            return document.createTextNode(node)
        }
        
        // 创建根元素element
        const element = document.createElement(node.tagName);

        
        // 设置元素属性
        if (node.props !== null && typeof node.props === 'object') {
            // 将node.props遍历,将其key, value通过setAttribute塞值给element
            for (let key in node.props) {
                element.setAttribute(key, node.props[key])
            }
        }

        // 处理子节点
        if (Array.isArray(node.children)) {
            // 递归处理子节点并添加到当前元素
            node.children.forEach(childNode => {
                const childElement = createDOMElement(childNode)
                // 将处理好的子节点push到element
                element.appendChild(childElement)
            })
        } else if (node.text) {
            // 处理文本节点
            element.appendChild(document.createTextNode(node.text))
        }
        
        return element
    }

    // 使用示例

    const data = {
        tagName: 'ul',
        props: { 'class': 'list' },
        children: [
            { tagName: 'li', children: ['douyin'] },
            { tagName: 'li', children: ['toutiao'] },
            {
                tagName: 'li',
                children: [
                    {
                        tagName: 'span',
                        props: { 'class': 'span' },
                        text: 'meituan'
                    },
                ]
            },
        ]
    };



    // 生成DOM元素并插入到页面中
    const rootElement = createDOMElement(data);
    document.body.appendChild(rootElement);
</script>
相关推荐
清木!2 分钟前
排序算法比较
数据结构·算法·排序算法
汉克老师1 小时前
GESP6级C++考试语法知识(十七、数据结构(三、认识队列 Queue))
数据结构·c++·队列·gesp6级·gesp六级·数组模拟队列
JavaWeb学起来1 小时前
Python学习教程(六)数据结构List(列表)
数据结构·python·python基础·python教程
啊董dong4 小时前
noi-2026年5月12号小测验
数据结构·c++·算法
南境十里·墨染春水5 小时前
数据结构 —— 链表
数据结构·链表
图码6 小时前
二分查找进阶:如何在有序数组中快速找到Upper Bound?
数据结构·算法·面试·分类·柔性数组
Cthy_hy6 小时前
树状数组(BIT)进阶:差分优化实现区间修改、区间查询
数据结构·python·算法
代码中介商8 小时前
红黑树完全指南:从五条性质到完整插入删除实现
数据结构·算法
Sarvartha9 小时前
单链表的顺序建立与结点的删除(期末题复现)
数据结构
Dlrb121111 小时前
数据结构-链表
数据结构·链表·逻辑结构·单向链表·物理结构·valgrind工具