javascript - 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。我需要密钥是具有更多密钥的对象。
解决方案
您可以直接使用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; }
推荐阅读
- python - 多元数据的非规范化
- google-apps-script - 例外:您在短时间内创建或删除了太多日历或日历事件。请稍后再试
- java - Spring Boot 不会在可连接件中拉动柱子。相反,它只是在列中添加一个数字
- sql - 从一组日期生成日期范围的年份
- excel - 如何在查找表中添加连续值
- javascript - 节点中的垃圾收集
- android - MotionLayout KeyCycle 和 KeyTimeCycle
- python - Deleting elements of lists, within other lists in Python
- slf4j - 以编程方式打开或关闭到 Slf4j 的全局 RestAssured 日志记录
- python - Tksheet宽度参数不改变宽度?