首页 > 解决方案 > 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: {}
             }
          }
       }
   }
} 

我已经尝试过使用这样的方法: 在javascript中从平面数组构建树数组 但是这个算法使用推送函数将新分支添加到arraykey。我需要密钥是具有更多密钥的对象。

标签: javascriptarraysjsonangulartypescript

解决方案


您可以直接使用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; }


推荐阅读