如何以类似以下形式解析js数组:

const arr = [
            "&&",
            [
                "==",
                "first",
                "1-1"
            ],
            [
                "&&",
                [
                    "==",
                    "second1",
                    "2-1"
                ],
                [
                    "==",
                    "second2",
                    "2-2"
                ]
            ]
        ]

表单中的超文本标记语言无序(Ul)列表:

<ul>
    <li>&&
        <ul>
            <li>first == 1-1</li>
            <li>&&
                <ul>
                    <li>second1 == 2-1</li>
                    <li>second2 == 2-2</li>
                </ul>
            </li>
        </ul>
    </li>
</ul>

ARR总是以[运算符,条件/子函数]的形式出现. 正如你可以猜测,我需要一个用户界面来编辑ARR内容.ARR表示JSON字符串中"where"筛选器定义的形式.因此,当用户更改列表(添加或删除无序列表中的 node )时,我需要将更改解析回数组,但首先要做的是. 也许有一些图书馆,但我找不到它.

我try 了这样的递归:

    function arrayToHTML(arr, container) {
     if (!Array.isArray(arr) || arr.length === 0) return
     const operator = arr[0]
     const conditions = arr.slice(1)
     if (operator === '&&') {
      this.arrayToHTML(conditions, container)
     }
    }

推荐答案

一种可能的 Select 是将数组(op)的第一个运算符元素与数组(conds)的其余部分分开(使用参数destructuring完成),然后使用运算符元素构建<li>,下面嵌套子元素,该元素是基于映射conds数组构建的.对于conds中的每个数组,可以判断第二个元素是否是数组(表明它是嵌套/子条件),如果是,则再次递归构建列表 struct .否则,如果第二个参数不是数组,那么您就达到了基本条件,可以构建子/终止<li>条件字符串:

const arr = ["&&", [ "==", "first", "1-1" ], [ "&&", [ "==", "second1", "2-1" ], [ "==", "second2", "2-2" ] ] ];

const generateHTMLAux = ([op, ...conds]) => {
  return `<li>${op}
    <ul>
      ${conds.map(cond => {
        const [first, second, third] = cond;
        return Array.isArray(second)
          ? generateHTMLAux(cond)
          : `<li>${second} ${first} ${third}</li>`;
      }).join('')}
    </ul>
  </li>`;
}
const generateHTML = (arr) => `<ul>${generateHTMLAux(arr)}</ul>`;

const res = generateHTML(arr);
document.body.innerHTML = res;
console.log(res);
See browser console for HTML structure

Javascript相关问答推荐

是什么原因导致此Angular 16电影应用程序中因类型错误而不存在属性?

按钮未放置在html dis位置

JQuery. show()工作,但. hide()不工作

如何在不创建新键的情况下动态更改 map 中的项目?

如何从调整大小/zoom 的SVG路径定义新的d属性?""

cypress中e2e测试上的Click()事件在Switch Element Plus组件上使用时不起作用

使用Promise.All并发解决时,每个promise 的线性时间增加?

Reaction Native中的范围滑块

在运行时使用Next JS App Router在服务器组件中运行自定义函数

在浏览器中触发插入事件时检索编码值的能力

WP Bootstrap NavWaker:下拉菜单一次打开所有下拉菜单

Puppeteer上每页的useProxy返回的不是函数/构造函数

expo 联系人:如果联系人的状态被拒绝,则请求访问联系人的权限

使用Document.Evaluate() Select 一个包含撇号的HTML元素

如何在FiRestore中的事务中使用getCountFromServer

我的NavLink活动类在REACT-ROUTER-V6中出现问题

是否有静态版本的`instanceof`?

当S点击按钮时,我如何才能改变它的样式?

将Windows XP转换为原始数据以在html前端中显示

在D3.js中创建具有旋转手柄的可拖动、可调整大小的框?