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

2023-11-27

我有一个角色对象,我想使用 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但它映射相同的字段名称。

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

代码示例将受到高度赞赏。


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

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

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

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

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

If这些是正确的,那么您可以使用以下内容roleToTreeNode()函数来映射Role反对TreeNode<Role> object:

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

The children:线是函数的操作部分:您正在采取role.roles数组,并映射每个Role元素到一个TreeNode<Role>,这就是roleToTreeNode()函数确实如此。那是,roleToTreeNode()是一个调用自身的递归函数。

这有道理吗?希望有帮助。祝你好运!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Typescript 中将一个对象映射到另一个对象 的相关文章

随机推荐

  • UUID 有多独特?

    使用 UUID 唯一标识某些内容 我将其用于上传到服务器的文件 有多安全 据我了解 它是基于随机数的 然而 在我看来 只要有足够的时间 它最终会重演 纯粹是偶然 是否有更好的系统或某种类型的模式来缓解这个问题 非常安全 the annual
  • Java(Android)中自动检测文本的语言[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 对于我的应用程序 我希望给定一个文本 检测其语言 例如 ISO 代码和机会 我想知道是否有某种网络服务或java库可以这样做 提前致谢 使用二元分析
  • movl $_start, %eax 是什么意思?

    后面跟一个标识符是什么意思 x86 汇编 AT T 语法 在 AT T 语法中 意味着将后面的内容视为立即常量而不是内存地址 换句话说 movl start eax 加载符号的地址 start进入 eax movl start eax 从内
  • 如何为 python 获取 PIP [重复]

    这个问题在这里已经有答案了 我正在尝试安装 pip py 每当我搜索安装程序时 它都会打开一个新选项卡 其中包含代码 但我无法下载任何内容 我打算做什么 我打算将代码复制粘贴到Python解释器中吗 如何让它适用于 Windows 7 32
  • 在 Python 2.7 中从数字列表中删除一组索引的最有效方法是什么?

    所以我想知道如何使用 Python 2 7 最有效地获取用于表示索引的值列表 如下所示 但长度最多为 250 000 indices 2 4 5 并从更大的列表中删除该索引列表 如下所示 3 000 000 项 numbers 2 6 12
  • 如何在Linux上高效监控目录变化?

    我正在使用 Magento 有一个功能可以将 CSS 和 Javascript 合并到一个大文件中 不管其优点和缺点 都存在以下问题 最终文件会在多个级别进行缓存 包括但不限于 亚马逊云前 代理服务器 客户端浏览器缓存 Magento 使用
  • Aurelia 语义下拉菜单

    我正在尝试在 Aurelia 中使用组合框 以便我的用户可以输入下拉列表并搜索内容 我试图合并 Semantic 创建的下拉菜单 但是当我在元素上调用下拉菜单时 它不会运行代码 因此它仍然是一个正常的下拉菜单 就像这里的状态示例一样 htt
  • R 从面板中删除行,同时保持面板平衡

    有没有一种优雅的方法来平衡不平衡的面板数据集 我想从一个不平衡的面板 即 有些人丢失了一些数据 开始 最后得到一个平衡的面板 即 所有的人都没有丢失任何数据 下面是一些示例代码 正确的最终结果是保留对 Frank 和 Edward 的所有观
  • 如何从 Blazor 服务器端下载内存中文件

    有没有办法下载动态生成的文件在记忆中 in Blazor 服务器端不需要将其存储在文件系统上 解决方案是添加Web Api控制器到 Blazor 服务器端应用程序中 Add Controllers DownloadController cs
  • Android TabHost 上的徽章

    我想实现与 iPhone 中相同的功能 我在底部栏中实现了与 iPhone 中相同的自定义 Tabhost 我可以设置 正常 选定状态的两个图标 但我需要带有数量的动态图标 通知如图片所示 Thanks Android ViewBadger
  • 增强named_mutex和remove()命令

    我有一个可以由多个线程创建的类 但在一个函数中 代码需要受到保护 因此我决定使用 boost 进程间互斥体 每个类在其构造函数中创建或打开相同的互斥体 MyClass MyClass boost interprocess named mut
  • 对于布尔字段,其 getter/setter 的命名约定是什么?

    Eg boolean isCurrent false 你将它的 getter 和 setter 命名为什么 假设你有 boolean active 访问器方法是 public boolean isActive return this act
  • 依赖属性强制绑定问题

    我同时安装了 VS2008 和 VS2010 我看到一个非常奇怪的行为 在 VS2008 中 我有一个简单的 WPF 应用程序
  • 显示时未转换 Unicode

    我正在将应用程序本地化为西班牙语 并且使用 Unicode 在该语言的 Localized strings 文件中对字符进行编码 例如 我有以下条目 login saveSettings Guardar configuraci u00F3n
  • PHP 标头(位置:...):强制地址栏中的 URL 更改

    我目前正在开发一个移动网站 该网站使用 PHP 会话与数据库进行身份验证 我有一个登录页面 其中包含一个表单 可以转到服务器登录 php提交时 然后 php 文件创建一些会话数据 存储在 SESSION 中 并将用户重定向回索引页面 hea
  • 为什么 printf 在调用后不会刷新,除非格式字符串中有换行符?

    为什么printf除非格式字符串中有换行符 否则调用后不会刷新 这是 POSIX 行为吗 我怎么可能有printf每次都立即冲水 The stdout默认情况下 流是行缓冲的 因此只会在到达换行符 或被告知时 后显示缓冲区中的内容 您有几个
  • Flutter 如何将图像文件保存到图库中的新文件夹?

    我想在从相机获取文件后将图像保存在图库中 如何创建一个新目录并保存我们从相机获取的图像文件 Future getImageCamera async var imageFile await ImagePicker pickImage sour
  • 为什么 Clojure 对非法参数说“没有匹配方法”?

    Character isWhitespace 的正确用法包括 Character isWhitespace a gt false Character isWhitespace gt true 然而 我的第一次尝试是这样的 我发现这个错误令人
  • 为什么不能将 cout 与用户定义的 std::string 转换一起使用?

    这里我定义一个Date 并指定用户定义的转换 class Date private int day int month string dateStr public Date int day int month day day month m
  • 在 Typescript 中将一个对象映射到另一个对象

    我有一个角色对象 我想使用 PrimeNG 将其映射到 TreeNode 对象以将其显示在树中 角色对象是这样的 也如图所示 role id name description roles 树节点对象的结构如下 data label Docu