gpt4 book ai didi

typescript - 在 Typescript 中将一个对象映射到另一个对象

转载 作者:搜寻专家 更新时间:2023-10-30 21:17:38 27 4
gpt4 key购买 nike

我有一个角色对象,我想使用 PrimeNG 将其映射到 TreeNode 对象以在树中显示它。角色对象是这样的(如图所示)

role: [
id: ....
name: ....
description: ....
roles[]: .....
]

role object

树节点对象的结构如下:

{
"data":
[
{
"label": "Documents",
"data": "Documents Folder",
"expandedIcon": "fa-folder-open",
"collapsedIcon": "fa-folder",
"children": [{
"label": "Work",
"data": "Work Folder",
"expandedIcon": "fa-folder-open",
"collapsedIcon": "fa-folder",
"children": [{"label": "Expenses.doc", "icon": "fa-file-word-o", "data": "Expenses Document"}, {"label": "Resume.doc", "icon": "fa-file-word-o", "data": "Resume Document"}]
},
{
"label": "Home",
"data": "Home Folder",
"expandedIcon": "fa-folder-open",
"collapsedIcon": "fa-folder",
"children": [{"label": "Invoices.txt", "icon": "fa-file-word-o", "data": "Invoices for this month"}]
}]
},
{
"label": "Pictures",
"data": "Pictures Folder",
"expandedIcon": "fa-folder-open",
"collapsedIcon": "fa-folder",
"children": [
{"label": "barcelona.jpg", "icon": "fa-file-image-o", "data": "Barcelona Photo"},
{"label": "logo.jpg", "icon": "fa-file-image-o", "data": "PrimeFaces Logo"},
{"label": "primeui.png", "icon": "fa-file-image-o", "data": "PrimeUI Logo"}]
},
{
"label": "Movies",
"data": "Movies Folder",
"expandedIcon": "fa-folder-open",
"collapsedIcon": "fa-folder",
"children": [{
"label": "Al Pacino",
"data": "Pacino Movies",
"children": [{"label": "Scarface", "icon": "fa-file-video-o", "data": "Scarface Movie"}, {"label": "Serpico", "icon": "fa-file-video-o", "data": "Serpico Movie"}]
},
{
"label": "Robert De Niro",
"data": "De Niro Movies",
"children": [{"label": "Goodfellas", "icon": "fa-file-video-o", "data": "Goodfellas Movie"}, {"label": "Untouchables", "icon": "fa-file-video-o", "data": "Untouchables Movie"}]
}]
}
]

 data.roles.forEach((role, index) => {
//this.roleTree.label = role.Name;
//this.roleTree.data = role.ID;

let treeNode: TreeNode = {
label: role.Name,
data: role

}

this.treeNodes.push(treeNode);
console.log(role);
console.log(index);

});

但是当我尝试将'role'中的'roles'映射到treeNode中的'children'时,这段代码似乎太复杂了。我见过一些例子,比如 this但它映射的是相同的字段名称。

我是 Typesript 的新手,是否有一种变通方法可以通过指定我的字段名(例如名称)映射到角色的“标签”,将我的角色对象转换为带有子节点的 treeNode?

非常感谢代码示例。

最佳答案

嗯,我不是 100% 确定 RoleTreeNode你正在使用的类型。这是我根据您问题中的代码做出的猜测。

Role有一些您关心的属性,但棘手的是 roles属性,我猜它应该是 Role 的数组对象:

interface Role {
id: string;
name: string;
description: string;
roles: Role[];
}

同样,TreeNode有一些属性,但棘手的是 children属性是 TreeNode 的数组对象。另外,我假设 TreeNodedata 类型中是通用的, 在这种情况下你想做 TreeNode<Role> , 意思是 data属性将是 Role对象:

interface TreeNode<T> {
label: string;
data: T;
expandedIcon?: string;
collapsedIcon?: string;
children: TreeNode<T>[];
}

如果这些都是正确的,那么您可以使用以下 roleToTreeNode()映射 Role 的函数反对 TreeNode<Role>对象:

function roleToTreeNode(role: Role): TreeNode<Role> {
return {
label: role.name,
data: role,
children: role.roles.map(roleToTreeNode)
};
}

children: line 是函数的操作部分:你正在使用 role.roles数组,并映射每个 Role元素到 TreeNode<Role> ,这就是 roleToTreeNode()功能确实如此。即 roleToTreeNode()是一个调用自身的递归函数。

这有意义吗?希望有所帮助。祝你好运!

关于typescript - 在 Typescript 中将一个对象映射到另一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45991866/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com