代码之家  ›  专栏  ›  技术社区  ›  Alen Kelemen

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

  •  1
  • Alen Kelemen  · 技术社区  · 2 年前

    如何解析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)
         }
        }
    
    1 回复  |  直到 2 年前
        1
  •  1
  •   Nick Parsons Felix Kling    2 年前

    一种可能的选择是分离出数组的第一个运算符元素( op )从数组的其余部分( conds )(使用参数完成 destructuring )然后构建您的 <li> 使用操作符元素,下面有嵌套的子元素,它是基于映射 conds 大堆对于中的每个阵列 conds ,您可以检查第二个元素是否是数组(表明它是嵌套/子条件),如果是,则再次递归构建您的列表结构。否则,如果第二个参数不是数组,那么您已经达到了基本情况,可以构建子/终止 <李> 条件字符串:

    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