[javascript]在js中将数组解析为无序列表

· 收录于 2024-01-06 16:46:10 · source URL

问题详情

如何以类似于以下内容的形式解析js数组:

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

到 HTML 无序 (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 在形式上是 [运算符、条件/子齿]。 正如你所猜到的,我需要一个UI来编辑arr内容。Arr 表示 JSON 字符串中where筛选器定义的形式。因此,当用户更改列表(在无序列表中添加或删除节点)时,我需要将更改解析回数组,但首先要做的事情。 也许有一些图书馆,但我找不到它。

我尝试了这样的递归:

    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)
     }
    }

最佳回答

一种可能的选择是将数组 (op) 的第一个运算符元素与数组的其余部分 (conds) 分离出来(使用参数 <a href=https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment rel=nofollow noreferrer>destructuring) 完成),然后使用 operator 元素构建 <li>,下面嵌套子元素,该元素基于映射 cond 构建数组。不过,在映射 conds 数组之前,您可以首先检查 conds 中的第一个元素是否是数组(如果它是 arary,则表明它具有嵌套/子条件)。如果它是一个数组,则可以再次递归构建列表结构。否则,如果 conds 中的第一个元素不是数组,那么你已经达到了基本情况,可以构建子/终止 <li> 条件字符串:

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

const generateHTMLAux = ([op, ...conds]) => {
  const [second, third] = conds;

  return Array.isArray(second)
    ? `<li>${op}
      <ul>
        ${conds.map(generateHTMLAux).join('')}
      </ul>
    </li>`
    : `<li>${second} ${op} ${third}</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