当前位置: 首页 > web >正文

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

题目描述:

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

输入:


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'},]},]
};

输出:

<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;

具体代码如下:

<script>/*** 将自定义数据结构转换为DOM元素* @param {Object} node - 包含标签名、属性和子节点的数据对象* @returns {HTMLElement} 生成的DOM元素*/function createDOMElement(node) {// 处理非对象类型(如文本节点)if (typeof node === 'string') {return document.createTextNode(node)}// 创建根元素elementconst element = document.createElement(node.tagName);// 设置元素属性if (node.props !== null && typeof node.props === 'object') {// 将node.props遍历,将其key, value通过setAttribute塞值给elementfor (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到elementelement.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>

http://www.xdnf.cn/news/13590.html

相关文章:

  • 面壁智能MiniCPM4.0技术架构与应用场景
  • 雷卯针对易百纳G16DV5-IPC-38E型主控板防雷防静电方案
  • Sentinel介绍
  • java大文件分段下载
  • (ML-Agents) 是一个开源项目,它使游戏和模拟能够作为使用深度强化学习和模仿学习训练智能代理的环境
  • Java SE - 类和对象入门指南
  • MCP 协议系列序言篇:开启 AI 应用融合新时代的钥匙
  • 爬取汽车之家评论并利用NLP进行关键词提取
  • 2025.6.11总结
  • RuoYi 前后端分离项目 Linux 部署全指南
  • 第四章无线通信网
  • 安卓15开机启动Fallbackhome去除--成果展示
  • 看板中如何管理技术债务
  • 智慧厕所系统:革新公共卫生设施的新势力
  • 以 OCP 认证培训为翼,翱翔数据库广阔天空
  • 基础篇:5. HTTP/2 协议深度解析
  • 青藏高原地区多源融合降水数据(1998-2017)
  • C#使用MindFusion.Diagramming框架绘制流程图(3):加权图的最短路径算法
  • Web APIS Day03
  • 全连接层和卷积层
  • 辗转相除法(求最大公约数)
  • Boost.Interprocess 介绍与使用
  • 2025年高考志愿填报指导资料
  • shap可解释恶意流量检测
  • Zab协议剖析:崩溃恢复与顺序原子广播
  • JS手写代码篇---手写深拷贝
  • 万字深度解析注意力机制全景:掌握Transformer核心驱动力​
  • PHP性能提升方案
  • Redis的主从复制底层实现
  • 数组方法_push()/pop()/数组方法_shift()/unshift()