javascript - TypeScript 平面数组到对象树

标签 javascript arrays json angular typescript

我实现了一个 UI 以更好地概述我们的 LDAP 分支。 为此,我想使用 Angular Materials Tree。单击所有分支非常好而且非常直观。 ( https://material.angular.io/components/tree/overview )

我有什么:

作为字符串的多个 LDAP 路径数组:

groups = [
     'cn=devops,ou=smallUnit1,ou=unit1,o=group1,c=de',
     'cn=devops,ou=smallUnit1,ou=unit1,o=group2,c=de',        
     'cn=devops,ou=smallUnit2,ou=unit1,o=group1,c=de',
     'cn=dev,ou=smallUnit1,ou=unit2,o=group1,c=de',
     'cn=dev,ou=smallUnit1,ou=unit1,o=group2,c=de',
     'cn=ops,ou=smallUnit1,ou=unit1,o=group1,c=de'
]

我已经做了什么:

我将此字符串转换为具有依赖关系的独立路径数组。 组 [0] 的示例:

dependencies = [
   {id: 'c=de',          parent: NULL,            child: 'o=group1'},
   {id: 'o=group1',      parent: 'c=de',          child: 'ou=unit1'},
   {id: 'ou=unit1',      parent: 'o=group1',      child: 'ou=smallUnit1'},
   {id: 'ou=smallUnit1', parent: 'ou=unit1',      child: 'cn=devops'},
   {id: 'cn=devops',     parent: 'ou=smallUnit1', child: NULL}

]

我需要什么:

我需要一个对象,其中所有键都是我们 LDAP 的路径:

{
   c=de: {
       o=group1: {
          ou=unit1: {
             ou=smallUnit1: {
                cn=devops: {},
                cn=ops: {}
             }
             ou=smallUnit2: {
                cn=devops: {}
             }
          },
          ou=unit2: {
             ou=smallUnit1: {
                cn=dev: {}
             }
          }
       },
       o=group2: {
          ou=unit1: {
             ou=smallUnit1: {
                cn=devops: {},
                cn=dev: {}
             }
          }
       }
   }
} 

我已经尝试过使用这样的方法: Build tree array from flat array in javascript 但是这个算法使用 push 函数将新分支添加到数组键中。我需要键是一个具有更多键的对象。

最佳答案

您可以直接使用 groups,因为所有信息都以相反的顺序存在,而 dependencies 不存在。

基本上你需要

  • 迭代
  • 拆分的字符串
  • 将右侧的值作为对象的键,并为每一步返回内部对象。

var groups = ['cn=devops,ou=smallUnit1,ou=unit1,o=group1,c=de', 'cn=devops,ou=smallUnit1,ou=unit1,o=group2,c=de', 'cn=devops,ou=smallUnit2,ou=unit1,o=group1,c=de', 'cn=dev,ou=smallUnit1,ou=unit2,o=group1,c=de', 'cn=dev,ou=smallUnit1,ou=unit1,o=group2,c=de', 'cn=ops,ou=smallUnit1,ou=unit1,o=group1,c=de'],
    tree = groups.reduce((object, string) => {
        string
            .split(',')
            .reduceRight((o, k) => o[k] = o[k] || {}, object);
        return object;
    }, {});

console.log(tree);
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - TypeScript 平面数组到对象树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51513434/

相关文章:

javascript - Ajax 不只获取 json 输出数据(它打印整个加载的 View 代码。)。?代码点火器

javascript - 如何将数组中的已排序数组合并为第三个已排序数组

javascript - 在被调用函数中重新初始化数组

java - 结合使用XML Schema和XML到JSON转换是否可行?

json - 使用嵌套的未知 ID 在 swift 4 中解析 JSON

javascript - Chrome插件CORS Toggle无法使用POST/PUT/DELETE方法工作

javascript - 如何在 jquery-chosen 下拉列表中按字母顺序重新排序 <options>

python - 如何将 MongoDB 查询转换为 JSON?

javascript - 如何在 redux 中替换对象属性值

arrays - 如何获得整个矩阵,数组或数据框的均值,中位数和其他统计信息?