【问题标题】:TypeScript flat Array to object treeTypeScript 平面数组到对象树
【发布时间】:2019-01-01 22:48:41
【问题描述】:

我实现了一个 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 函数将新分支添加到 arraykey。我需要 key 是具有更多键的对象。

【问题讨论】:

  • 数据排序了吗?没有,你如何区分 ou=smallUnit1 和 ou=unit1ou=unit2

标签: javascript arrays json angular typescript


【解决方案1】:

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

基本上你需要

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

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; }

【讨论】:

    【解决方案2】:

    在我看来,这应该可以解决问题(鉴于您当前的示例数据):

    const 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}
    ];
    
    let transformed = {};
    let tracker = transformed;
    
    dependencies.forEach(d => {
      tracker[d.id] = {};
      tracker = tracker[d.id];
    });
    
    console.log(transformed);

    【讨论】:

    • 您好,感谢您的帮助。看起来我只能创建一个分支。不是一棵树。还是我错了?
    • 不,这意味着您可以随心所欲地创建,但是您提供的dependencies 数组只包含一个分支。
    猜你喜欢
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    相关资源
    最近更新 更多