如何从 JavaScript 模板自动生成分层数据结构 [已关闭]

问题描述 投票:0回答:1

我正在开发一个 JavaScript 工具,旨在简化大型树状数据结构的创建。该概念涉及定义层次结构并指定每个嵌套级别内的项目数量。随后,我的目标是让 JavaScript 生成一个表示该层次结构的数组。期望的结果是获得一个扁平的项目列表,每个项目都有一个关联的parentId来表示它们在层次结构中的位置。如何在 JavaScript 中有效地实现这一点?

输入

    [{
      id: "123",
      parentId: null,
      name: "ep101",
      seq: ["ep101", "ep102"]
    }, {
      id: "234",
      parentId: "123",
      name: "ep101sh010",
      seq: ["ep101sh010", "ep101sh020"]
    }, {
      id: "345",
      parentId: "234",
      name: "Generic",
      seq: []
    }];

输出

          [{
        id: "123",
        parentId: null,
        name: "ep101"
      }, {
        id: "234",
        parentId: "123",
        name: "ep101sh010"
      }, {
        id: "345",
        parentId: "234",
        name: "Generic"
      }, {
        id: "235",
        parentId: "123",
        name: "ep101sh020"
      }, {
        id: "346",
        parentId: "235",
        name: "Generic"
      }, {
        id: "124",
        parentId: null,
        name: "ep102"
      }, {
        id: "244",
        parentId: "124",
        name: "ep102sh010"
      }, {
        id: "355",
        parentId: "244",
        name: "Generic"
      }, {
        id: "245",
        parentId: "124",
        name: "ep102sh020"
      }, {
        id: "356",
        parentId: "245",
        name: "Generic"
      }];
javascript arrays data-structures hierarchy hierarchical-data
1个回答
0
投票

目标是创建一个具有父子关系的树结构,并将其扁平化为具有 id、parentId 和 name 属性的项目。

在输入字符串中,您有一个具有类似模板格式的初始结构,其中每个对象都有一个 id、parentId、name 和 seq 属性。 seq 属性似乎表示子节点的序列。 输出似乎是该结构的扁平化版本,其中所有子节点都展开,并且每个节点都有唯一的 ID、parentId 和名称。

下面的代码将帮助您实现输出:

  function flattenHierarchy(input) {
      const output = [];
      const stack = [...input];
      let counter = 0;
      while (stack.length > 0) {
          const node = stack.pop();
          const newNode = {
              id: node.id,
              parentId: node.parentId,
              name: node.name
          };
          output.push(newNode);
          if (node.seq && Array.isArray(node.seq)) {
              for (let i = node.seq.length - 1; i >= 0; i--) {
                  const childName = node.seq[i];
                  const childNode = {
                      id: (++counter).toString(),
                      parentId: newNode.id,
                      name: childName
                  };
                  output.push(childNode);
                  stack.push(childNode);
              }
          }
      }
      return output;
    }
    const input = [{
      id: "123",
      parentId: null,
      name: "ep101",
      seq: ["ep101", "ep102"]
    }, {
      id: "234",
      parentId: "123",
      name: "ep101sh010",
      seq: ["ep101sh010", "ep101sh020"]
    }, {
      id: "345",
      parentId: "234",
      name: "Generic",
      seq: []
    }];
    const output = flattenHierarchy(input);
    console.log(output);
© www.soinside.com 2019 - 2024. All rights reserved.