从数组创建对象树

2023-12-04

我想从数组中创建一个对象树。 这里向我提供了一个很好的解决方案(我发现了“reduce”方法):Javascript 使用 object.create() 从字符串构建一棵树实际上,我的需求有点不同,而且我无法适应提供的代码......所以我回到这里寻求帮助! (谢谢你)。 我将在本文末尾发布完整的初始代码

input :

[
  {
    "name": "John Doe",
    "service": "EE",
  },
  {
    "name": "Jane Doe",
    "service": "EE.EA",
  },
  {
    "name": "Jack Smith",
    "service": "EE.EA.EB",
  },
  {
    "name": "Jill Smith",
    "service": "EE.EA.EC"
  },
  {
    "name": "Jake Smith",
    "serviceLevel": "EE.EA.EC"
  }
]

output:

{
    "EE":
    {
        "serviceFather": "root",
        "people": [
        {
            "name": "John Doe"
        }],
        "serviceChildren":
        {
            "EA":
            {
                "serviceFather": "EE",
                "people": [
                {
                    "name": "Jane Doe"
                }],
                "serviceChildren":
                {
                    "EB":
                    {
                        "serviceFather": "EA",
                        "people": [
                        {
                            "name": "Jack Smith"
                        }],
                        "serviceChildren":
                        {}
                    },
                    "EC":
                    {
                        "serviceFather": "EA",
                        "people": [
                        {
                            "name": "Jill Smith"
                        },
                        {
                            "name": "Jake Smith"
                        }],
                        "serviceChildren":
                        {}
                    }
                }
            }
        }
    }
}

初始代码:

function format(data) {
    const res = []
    data.forEach(obj => {
        obj.serviceTree.split('.').reduce((r, e, i, a) => {
            console.log(r, e, i, a);
            const oParent = r.find(({ name }) => name == a[i - 1]);
            const match = r.find(({ name }) => name == e);
            if (!match) {
                const o = Object.create(service);
                o.name = e;
                if (!a[i + 1]) {
                    o.serviceName = obj.serviceName;
                    o.serviceTree = obj.serviceTree;
                    o.serviceLevel = i;
                    o.serviceParent = (i == 0 ? 'root' : a[i - 1]);
                    o.people = [{
                        familyName: obj.familyName,
                        firstName: obj.firstName,
                        jobTitle: obj.jobTitle,
                        rank: obj.rank,
                        phone: obj.phone,
                        mobile: obj.mobile,
                        mail: obj.mail
                    }];

                    if (oParent) {
                        oParent.serviceChildren.push(o);
                    } else {
                        o.serviceChildren = [];
                        r.push(o);
                    }

                } else {
                    let treeStamp = a.slice();
                    treeStamp.pop();
                    o.serviceName = e;
                    o.serviceTree = treeStamp.join('.');
                    o.serviceLevel = i;
                    o.serviceParent = (i == 0 ? 'root' : a[i - 1]);
                    o.serviceChildren = [];
                    r.push(o);
                }
                return r;

            } else {
                if (!a[i + 1]) match.people.push({
                    familyName: obj.familyName,
                    firstName: obj.firstName,
                    jobTitle: obj.jobTitle,
                    rank: obj.rank,
                    phone: obj.phone,
                    mobile: obj.mobile,
                    mail: obj.mail
                });
                return match.serviceChildren;
            }
        }, res);
    });
    return res;
}

您可以采用拆分服务的一部分,并将其作为访问嵌套对象的密钥。

var data = [{ name: "John Doe", service: "EE" }, { name: "Jane Doe", service: "EE.EA" }, { name: "Jack Smith", service: "EE.EA.EB" }, { name: "Jill Smith", service: "EE.EA.EC" }, { name: "Jake Smith", service: "EE.EA.EC" }],
    result = {};

data.forEach(({ name, service }) => {
    service
        .split('.')
        .reduce((o, k, i, { [i - 1]: serviceFather = 'root' }) => {
            o.serviceChildren = o.serviceChildren || {};
            o.serviceChildren[k] = o.serviceChildren[k] || { serviceFather, people: []  };
            return o.serviceChildren[k];
        }, { serviceChildren: result })
        .people.push({ name });
});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从数组创建对象树 的相关文章

随机推荐

  • 根据时间范围变量重复行 - R

    我的数据中有一个列变量 它是一个时间范围 datesemployed 样本数据如下 name datesemployed university Kate Oct 2015 Jan 2016 Princeton Sue Nov 2015 De
  • SQL Server 树层次结构和具有重复记录 ID 的嵌套集

    鉴于我有这个结果集结构 多余的字段已被删除 Id ParentId Name Depth 是否可以按树顺序返回记录 即Parent then Children if a Child is a Parent 那么他们的Children 如果不
  • 如何在 Android 中暂停计时器?

    我已经浏览了链接http dewful com tag basic android timer关于android中的定时器应用程序 它运行良好 我需要添加暂停按钮来停止计时器 并添加播放按钮以从我停止的位置再次启动计时器 我能完成那个任务吗
  • 使用 Spring Data Neo4j 进行审计

    我目前正在开发一个使用 Spring Data Neo4j 的项目 每当创建 NodeEntity 时 我想创建一个引用的 Audit NodeEntity 其中包含创建日期和用户 我提出的一个解决方案是编写一个 AOP 方面 它挂接在我的
  • 导入错误 - 没有语言“eng”的本地化支持

    我知道有一个与这个问题相关的问题 但我找不到我所期望的 ImportError Python 中的语言 eng 没有本地化支持 我收到错误 Import Error No localization support for language
  • 如何在ReactJS中实现带有受控组件的动态表单?

    当我查看参考文献中的示例时controlled form components 在react js官网 我想知道应该如何实施form您将能够remove and add input元素以动态方式使其成为受控组件 这可能吗 在例子中我们可以看
  • Node.js Sass 版本 7.0.0 与 ^4.0.0 || 不兼容^5.0.0 || ^6.0.0

    我使用 Node js v16 13 1 并创建了一个 React 应用程序 我尝试使用Sass 但是当我尝试运行它时 出现以下错误 Node Sass 版本 7 0 0 与 4 0 0 不兼容 5 0 0 6 0 0 如果你想使用SCSS
  • 使用 ffmpeg 将图像编码为视频

    我正在尝试将一系列图像编码为一个视频文件 我正在使用 api example c 中的代码 它可以工作 但它在视频中给了我奇怪的绿色 我知道 我需要将 RGB 图像转换为 YUV 我找到了一些解决方案 但它不起作用 颜色不是绿色而是很奇怪
  • Oracle Apex 5 - 页脚栏,类似于 App Builder 中的页脚栏

    如何在 Oracle Apex 通用主题应用程序中创建页脚栏 区域 就像在 Oracle Apex App Builder 中一样 实现该目标所需的 html css 代码是什么 具体来说 我有兴趣更改或替换 UT 中已存在的内容 以替换与
  • sed 用条件替换字符串

    我有一个文件包含几行 每一行的格式如下 2011 07 10 condition hhh aaa value bbb 2011 07 10 condition ccc aaa value bbb 我想使用 sed 查找 aaa 和 bbb
  • 如何正确迁移存储过程?

    我的任务是将站点从旧的客户端服务器转移到新的服务器 我已经从旧服务器完成了 sqldump 并导入到新服务器中 除了使用 mysqli 在 php 中完成的一些 sql 调用之外 它正在工作 我对存储过程不太熟悉 但我注意到失败的是如下所示
  • 如何在 gnuplot 中删除“跳跃”值之间的线?

    我想用包含 跳跃 值的图画一条线 举个例子 当我们绘制几个周期的 sin x 图形并绘制它时 会出现从右到左穿过的不切实际的线 如下图所示 避免这种情况的一个想法可能是使用with linespoints link 但我想在不修改原始数据文
  • 将事件插入带有 Intent 的日历时出错

    我正在尝试将事件插入calendar来自片段 但我不断收到错误 指出没有找到处理 Intent 的活动 这是错误 android content ActivityNotFoundException 找不到处理 Intent 的 Activi
  • 从目录中选择随机文件[重复]

    这个问题在这里已经有答案了 关于如何改进这种方法有什么建议吗 我目前正在使用它从壁纸目录中选择单个壁纸 我知道你不应该再使用 arraylist 但我想不出替代方案 我也不确定如何在目录信息中过滤不止一种类型的文件 即 jpg gif pn
  • 如何在for循环中正确调用递归函数?

    我正在尝试实现一个以目标为参数的方法string and an array with string其中的价值观 目标是检查是否可以使用数组的值构造给定的目标字符串 数组中的单词可以根据需要多次使用 例子 console log canCon
  • 将 Ctrl+Key 发送到第三方应用程序

    Im using a 3rd Party Application that exports a file The application uses a hot key Ctrl E as a shortcut for this functi
  • Sonar 插件不适用于使用 ANT 作为构建脚本的项目

    Problem 我刚刚安装了 Sonar Jenkins 插件 我进入我的配置作业 自由式作业 通过 ANT 构建生成 WAR 文件工件 并执行以下操作 选中声纳复选框 这里没有问题 配置声纳的安装目录 这里没有问题 选中了以下复选框 检查
  • 分页显示最大值并限制其余值

    现在我的分页会显示这样的内容 1 2 3 4 5 6 7 8 9 我怎样才能让它像这样显示 1 2 3 4 5 9
  • 如何在 OS X 中使用“SecItemAdd”存储对称密钥?

    我想在 OS X 的钥匙串中存储对称密钥 我通过 Apple DevDocs 阅读了我应该使用的内容SecItemAdd为此 我还阅读了 CryptoExercise 但没有给我任何解决方案 但是当我这样做时 我总是得到 OSStatuse
  • 从数组创建对象树

    我想从数组中创建一个对象树 这里向我提供了一个很好的解决方案 我发现了 reduce 方法 Javascript 使用 object create 从字符串构建一棵树实际上 我的需求有点不同 而且我无法适应提供的代码 所以我回到这里寻求帮助