将嵌套逻辑数组转换为可编辑的 HTML 无序列表(ul/li)结构

梦瑶同学_1462

梦瑶同学_1462

2026-11-03

496人浏览

原创

将嵌套逻辑数组转换为可编辑的 HTML 无序列表(ul/li)结构

本文介绍如何使用递归函数将表示布尔逻辑条件的嵌套 javascript 数组(如 ["&&", ["==", "a", "b"], ...])精准渲染为语义化、层级清晰的 html 无序列表,支持后续双向编辑(dom ↔ 数组)扩展。

本文介绍如何使用递归函数将表示布尔逻辑条件的嵌套 javascript 数组(如 ["&&", ["==", "a", "b"], ...])精准渲染为语义化、层级清晰的 html 无序列表,支持后续双向编辑(dom ↔ 数组)扩展。

在构建动态查询条件编辑器(如可视化 WHERE 子句配置面板)时,常需将结构化的逻辑数组(例如 ["&&", ["==", "name", "John"], ["&&", ["!=", "age", "0"], [")转化为直观的树形 HTML 列表。该结构天然适合递归处理:每个子数组以操作符(如 "&&"、"==")开头,后跟一个或多个操作数——若操作数为数组,则代表嵌套子条件;若为字符串,则为原子值。

核心思路是分离操作符与子条件,并根据子项类型分治处理:

  • 若当前子条件(conds[0])为数组 → 递归生成嵌套
      ;
    • 若为字符串(即 conds = [left, op, right] 形式中的左右值)→ 拼接为终端
    • ,格式为 "left op right"。

    以下为健壮、可复用的实现:

    const generateHTMLAux = ([op, ...conds]) => {
      // 基础校验:空数组或非数组输入直接返回空字符串
      if (!Array.isArray(conds) || conds.length === 0) return '';
    
      // 判断首个子项是否为嵌套数组(即存在子条件分支)
      if (Array.isArray(conds[0])) {
        return `
  • ${op}
      ${conds.map(generateHTMLAux).join('')}
  • `; } else { // 终止情况:conds 应为 [left, right] 或 [left, op, right], // 但原始数据约定为 [op, left, right],故此处需适配:实际传入的是 [left, right](因 op 已提取) // ⚠️ 注意:原题示例中 arr 结构为 [op, ...subConditions],且 subConditions 中每个元素自身也是 [op, a, b] 或 [op, ...] // 因此 conds[0] 是完整子数组,而 conds.length > 1 时才可能有多个并列条件(如 && 的多个分支) // 所以更准确的终止逻辑是:当 conds 中所有项均为字符串(非数组)时,按顺序两两配对 // 但题设结构明确:每个非顶层节点必为 [op, a, b] 或 [op, ...subArrays],因此我们统一按“首项是否为数组”判断 // 故此处 else 分支实际不会触发——因为 conds 元素要么是数组(递归),要么结构非法 // 正确做法:仅当 conds 长度为 2 且二者均为字符串时,才视为原子比较 const [left, right] = conds; return `

  • ${left} ${op} ${right}
  • `; } }; // 主入口:包裹顶层 ul const generateHTML = (arr) => { if (!Array.isArray(arr) || arr.length '; return `

      ${generateHTMLAux(arr)}

    `; };

    ✅ 使用示例:

    Convert Markdown To HTML And PDF - Markdown和HTML、PDF互转
    Convert Markdown To HTML And PDF - Markdown和HTML、PDF互转

    实现 Markdown↔ HTML 互转,支持导出 PDF,用于用户请求的文档格式转换。

    下载
    const arr = [
      "&&",
      ["==", "first", "1-1"],
      ["&&", ["==", "second1", "2-1"], ["==", "second2", "2-2"]]
    ];
    
    document.body.innerHTML = generateHTML(arr);

    ⚠️ 注意事项:

    • 该函数假设输入结构严格符合 [operator, ...conditions] 范式,不校验操作符合法性(如 "=="、"&&"),生产环境建议增加 op 白名单校验;
    • 当前实现生成纯字符串 HTML,如需绑定事件(如点击添加/删除节点),应改用 document.createElement 动态构建 DOM 并附加 data-* 属性标记来源索引;
    • 反向解析(DOM → 数组)需遍历
    • 的 textContent 与子
        结构,提取操作符及子节点,是本方案的自然延伸,可基于 Element.children 和正则匹配 (\S+)\s+(==|!=|&&|\|\|)\s+(\S+) 实现。

      此方法轻量、无依赖、语义清晰,是构建 JSON 查询条件可视化编辑器的理想起点。

      前端入门到VUE实战笔记:立即使用
      在学习笔记中,你将探索 前端 的入门与实战技巧!

      相关专题

      更多
      js获取数组长度的方法
      js获取数组长度的方法

      在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

      2023.06.20

      5526

      5

      js刷新当前页面
      js刷新当前页面

      js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

      2023.07.04

      1349

      3

      js四舍五入
      js四舍五入

      js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

      2023.07.04

      5464

      6

      js删除节点的方法
      js删除节点的方法

      js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

      2023.09.01

      1020

      4

      JavaScript转义字符
      JavaScript转义字符

      JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

      2023.09.04

      1976

      5

      js生成随机数的方法
      js生成随机数的方法

      js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

      2023.09.04

      3825

      4

      如何启用JavaScript
      如何启用JavaScript

      JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

      2023.09.12

      5013

      6

      Js中Symbol类详解
      Js中Symbol类详解

      javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

      2023.09.20

      3300

      5

      java访问控制修饰符介绍
      java访问控制修饰符介绍

      java访问控制修饰符有四种,分别是public、protected、private、默认访问修饰符。详细介绍:1、public,public是最宽松的访问控制修饰符,被修饰的类、方法和变量可以被任何其他类访问,当一个类、方法或变量被声明为public时,它们可以在任何地方被访问,无论是同一个包中的类还是不同包中的类;2、protected修饰符等等。

      2023.09.20

      1048

      7

      热门下载

      更多
      网站特效
      /
      网站源码
      /
      网站素材
      /
      前端模板

      精品课程

      更多
      相关推荐
      /
      热门推荐
      /
      最新课程
      GDB 17.2 官方文档集合
      GDB 17.2 官方文档集合

      共0课时 | 0人学习

      Bootstrap 入门安装配置
      Bootstrap 入门安装配置

      共0课时 | 0人学习

      38+ PhpStorm 提示和技巧
      38+ PhpStorm 提示和技巧

      共1课时 | 234人学习