在 ant 设计中操作 json 数据以适应树数据表

Manipulate json data to fit in tree data table in ant design

提问人:Jing c 提问时间:9/7/2022 最后编辑:MatthiasJing c 更新时间:9/8/2022 访问量:438

问:

我需要将我的 API 调用数据操作为某种格式以显示在蚂蚁设计表(树数据)中。https://ant.design/components/table/#components-table-demo-tree-data

但是,我花了几个小时,但仍然无法弄清楚如何操作来自 API 的数据以以所需的格式显示。下面是一个示例,如果我根据 projectId 对信息进行分组。

每个树将显示 projectId,然后树中的信息(子树)将显示该项目中人员的所有信息。如果一个人在多个项目中,那么信息将存在于她所在的所有项目中。

谁能帮我解决这个问题。如何操作数据来实现此目的?

从需要操作的 API 调用中获取的对象:

{
  "data": [
    {
      "email": "[email protected]",
      "permissionIds": null,
      "roleIds": ["raa","baa","caa"],
      "projectIds": ["1aa","3aa"]
    },
    {
      "email": "[email protected]",
      "permissionIds": null,
      "roleIds": ["baa","caa"],
      "projectIds": ["1aa","2aa","3aa"]
    },
    {
      "email": "[email protected]",
      "permissionIds": null,
      "roleIds": ["caa"],
      "projectIds": ["1aa"]
    }
  ],
  "statusCode": 200,
  "succeeded": true,
  "code": "",
  "message": "",
  "additionalInfo": null
}

操作后,数据应如下所示:

const data = [
  {
    projectIds: "1aa",
    children: [
      {
        email: "[email protected]",
        permissionIds: null,
        roleIds: ["raa","baa","caa"],
        projectIds: "1aa",
      },
      {
        email: "[email protected]",
        permissionIds: null,
        roleIds: ["baa","caa"],
        projectIds: "1aa",
      },
      {
        email: "[email protected]",
        permissionIds: null,
        roleIds: ["caa"],
        projectIds: "1aa",
      }
    ]
  },
  {
    projectIds: "2aa",
    children: [
      {
        email: "[email protected]",
        permissionIds: null,
        roleIds: ["baa","caa"],
        projectIds: "2aa",
      }
    ]
  },
  {
    projectIds: "3aa",
    children: [
      {
        email: "[email protected]",
        permissionIds: null,
        roleIds: ["raa","baa","caa"],
        projectIds: "3aa",
      },    
      {
        email: "[email protected]",
        permissionIds: null,
        roleIds: ["baa","caa"],
        projectIds: "3aa",
      }
    ]
  }
];

表格的外观(另一个具有不同属性和结构的示例):

Before expanding

How the table should look like after expand

树表工作原理示例的代码:

https://codesandbox.io/s/antd-tree-table-forked-qc995o?file=/index.js

JavaScript ReactJS、 JSON 和 ANTD 数据操作

评论


答:

1赞 zemaj 9/7/2022 #1

看起来你只是想做一个转变。在这种情况下,您可以考虑以下解决方案,它使用 Array#map 和 Array#reduce 来输出您需要的格式。

更新的解决方案

const projectIdToChildrenDict = apiData.reduce((dict, item) => {
    item.projectIds.forEach(projectId => {
        if (dict[projectId] === undefined) {
            // instantiate empty array if the project id key is not found
            dict[projectId] = [];
        }
        dict[projectId].push(item);
    });

    return dict;
}, {})

const data = Object.keys(projectIdToChildrenDict).map(key => {
    return {
        projectIds: key,
        children: projectIdToChildrenDict[key]
    }
})

这不是一个完整的解决方案,但它应该能让你达到 90% 的目标。

第一部分是使用 Array#reduce 来构建一个对象。此对象类似于字典(因此得名),您可以在其中查找 projectId 并查看包含该项目 ID 的所有元素。projectIdToChildrenDict

然后,当我们初始化时,我们使用 Array#map 遍历先前构建的字典的键(项目 ID),并返回预期输出的新对象。data

评论

0赞 Jing c 9/8/2022
嗨,我刚刚测试了它,它很接近,但是在父级中,每次迭代子级中的projectId时,projectIds都会重复。你知道我该如何解决这个问题吗?不过感谢您的帮助,至少我现在可以考虑其他事情
0赞 Jing c 9/8/2022
很抱歉打扰了,但是如果 projectIds 是空列表或 null 怎么办。请问在这种情况下可以做些什么?
1赞 zemaj 9/8/2022
@Jingc 我已经更新了解决方案以为您提供更多帮助。看看你能从这里走多远!
0赞 Jing c 9/9/2022
嗨,对不起,子项中的 projectId 也只需要是当前组中的 projectId。(例如 projectIds: “1aa”,)