You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:Angular 5新手如何将指定JSON展示为树形结构

解决Angular 5中JSON转树形结构展示的问题

嘿,我懂你作为Angular 5新手的苦恼——把那堆扁平的JSON转成想要的树形结构展示,确实有点摸不着头脑!别慌,咱们一步步拆解来解决~

第一步:先把扁平数据转成树形结构格式

首先得把你原始JSON里的shapeDetails扁平数组,按name和number分组,再和task的嵌套结构结合起来,生成符合树形展示的数据源。你可以在组件里写一个转换方法:

// 假设你的原始数据存在这里
rawData = {
  "shape": [{
    "id": "1",
    "shapeDetails": [
      { "name": "someShape1", "number": "10", "identifier": "111" },
      { "name": "someShape1", "number": "10", "identifier": "222" },
      { "name": "someShape2", "number": "30", "identifier": "333" }
    ],
    "task": {
      "title": "first level",
      "key": "",
      "value": "",
      "childtask": [ { "title": "second..." } ]
    }
  }]
};

// 转换为树形结构的方法
transformToTree(): void {
  // 第一步:按name+number分组shapeDetails
  const groupedShapes = {};
  this.rawData.shape[0].shapeDetails.forEach(detail => {
    const groupKey = `${detail.name}_${detail.number}`;
    if (!groupedShapes[groupKey]) {
      groupedShapes[groupKey] = {
        title: `${detail.name} (${detail.number})`,
        childtask: []
      };
    }
    groupedShapes[groupKey].childtask.push({ title: detail.identifier });
  });

  // 第二步:把分组后的形状数据嵌入task的子节点(根据你的附图调整层级)
  this.treeData = {
    shape: [{
      ...this.rawData.shape[0],
      task: {
        ...this.rawData.shape[0].task,
        childtask: [
          ...this.rawData.shape[0].task.childtask,
          {
            title: "Shape Categories",
            childtask: Object.values(groupedShapes)
          }
        ]
      }
    }]
  };
}

// 在组件初始化时调用转换方法
ngOnInit(): void {
  this.transformToTree();
}

第二步:用Angular递归模板渲染树形

Angular里可以用ng-template实现递归渲染嵌套的树形结构,这样不管多少层都能自动渲染:

<!-- 根节点:渲染最外层的task -->
<div class="tree-container">
  <div *ngFor="let shape of treeData.shape">
    <div class="tree-node">{{ shape.task.title }}</div>
    <!-- 调用递归模板渲染子节点 -->
    <ng-container *ngTemplateOutlet="taskTemplate; context: { $implicit: shape.task.childtask }"></ng-container>
  </div>
</div>

<!-- 递归模板:负责渲染每一层的子节点 -->
<ng-template #taskTemplate let-childTasks>
  <div class="child-level">
    <div *ngFor="let task of childTasks" class="tree-node">
      {{ task.title }}
      <!-- 如果当前节点还有子节点,继续递归渲染 -->
      <ng-container *ngIf="task.childtask" 
                    *ngTemplateOutlet="taskTemplate; context: { $implicit: task.childtask }">
      </ng-container>
    </div>
  </div>
</ng-template>

第三步:加样式让树形结构更清晰

给树形节点加一些缩进和边框,让层级关系一目了然:

.tree-container {
  margin: 16px;
}

.tree-node {
  padding: 4px 0;
  font-size: 14px;
}

.child-level {
  margin-left: 20px;
  border-left: 1px solid #ddd;
  padding-left: 12px;
}

这样调整后,你就能得到和附图类似的树形展示啦!如果你的附图层级和我写的有差异,只需要修改transformToTree方法里的结构,把分组后的形状数据放到你需要的层级位置就行。

内容的提问来源于stack exchange,提问作者user2237700

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:19:45