我实现了一个 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/