簡體   English   中英

TypeScript平面數組到對象樹

[英]TypeScript flat Array to object tree

我實現了一個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中的平面數組構建樹數組,但是該算法使用push函數將新的分支添加到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; } 

在我看來,這應該可以解決問題(鑒於您當前的示例數據):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM