从 TypeScript 中的扁平对象数组构建树数组

huangapple go评论110阅读模式
英文:

Build tree array from flat object array in typescript

问题

以下是您要求的代码部分的翻译:

  1. const nest = (items, id = null, link = 'parent_id') =>
  2. items
  3. .filter(item => item[link] === id)
  4. .map(item => ({ ...item, children: nest(items, item.id) }));
  5. console.log(
  6. nest(comments)
  7. )

请注意,这是您提供的JavaScript代码,用于将JSON数据转换为树形结构。如果您需要更多帮助或有其他问题,请随时提出。

英文:

I have the following JSON:

  1. "response": [
  2. {
  3. "id": 2,
  4. "alias": "BOAZ01",
  5. "descrizione": "ISTANZA DA VALUTARE",
  6. "dataCreazione": "2022-12-21T09:01:09.972819",
  7. "dataAggiornamento": "2022-12-21T09:01:09.972776",
  8. "dataDisabilitazione": null,
  9. "abilitato": true,
  10. "attivita": null
  11. },
  12. {
  13. "id": 4,
  14. "alias": "BOAZ02",
  15. "descrizione": "ISTANZA IN VALUTAZIONE",
  16. "dataCreazione": "2022-12-21T09:01:58.87955",
  17. "dataAggiornamento": "2022-12-21T09:01:58.879506",
  18. "dataDisabilitazione": null,
  19. "abilitato": true,
  20. "attivita": {
  21. "id": 2,
  22. "alias": "BOAZ01",
  23. "descrizione": "ISTANZA DA VALUTARE",
  24. "dataCreazione": "2022-12-21T09:01:09.972819",
  25. "dataAggiornamento": "2022-12-21T09:01:09.972776",
  26. "dataDisabilitazione": null,
  27. "abilitato": true,
  28. "assegnazione": null,
  29. "operatoreCorrente": {
  30. "codiceFiscale": "YNDKPR83A07I282K",
  31. "nome": "SUPERADMIN",
  32. "cognome": "ZERODD",
  33. "email": "superadmin@zerodd.it",
  34. "dataCreazione": "2022-12-14T16:30:02.02323",
  35. "dataAggiornamento": "2022-12-14T16:48:30.933103",
  36. "abilitazioneEmail": true,
  37. "tipo": "SUPERPOTERI",
  38. "hibernateLazyInitializer": {
  39. }
  40. }
  41. }
  42. },
  43. {
  44. "id": 5,
  45. "alias": "BOAZ03",
  46. "descrizione": "ISTANZA VALUTATA",
  47. "dataCreazione": "2022-12-21T09:02:14.445142",
  48. "dataAggiornamento": "2022-12-21T09:02:14.4451",
  49. "dataDisabilitazione": null,
  50. "abilitato": true,
  51. "attivita": {
  52. "id": 4,
  53. "alias": "BOAZ02",
  54. "descrizione": "ISTANZA IN VALUTAZIONE",
  55. "dataCreazione": "2022-12-21T09:01:58.87955",
  56. "dataAggiornamento": "2022-12-21T09:01:58.879506",
  57. "dataDisabilitazione": null,
  58. "abilitato": true,
  59. "assegnazione": null,
  60. "operatoreCorrente": {
  61. "codiceFiscale": "YNDKPR83A07I282K",
  62. "nome": "SUPERADMIN",
  63. "cognome": "ZERODD",
  64. "email": "superadmin@zerodd.it",
  65. "dataCreazione": "2022-12-14T16:30:02.02323",
  66. "dataAggiornamento": "2022-12-14T16:48:30.933103",
  67. "abilitazioneEmail": true,
  68. "tipo": "SUPERPOTERI",
  69. "hibernateLazyInitializer": {
  70. }
  71. }
  72. }
  73. },
  74. {
  75. "id": 6,
  76. "alias": "BOAZ03.1",
  77. "descrizione": "ISTANZA VALUTATA-AMMISSIBILE",
  78. "dataCreazione": "2022-12-21T09:02:40.046325",
  79. "dataAggiornamento": "2022-12-21T09:02:40.046285",
  80. "dataDisabilitazione": null,
  81. "abilitato": true,
  82. "attivita": {
  83. "id": 5,
  84. "alias": "BOAZ03",
  85. "descrizione": "ISTANZA VALUTATA",
  86. "dataCreazione": "2022-12-21T09:02:14.445142",
  87. "dataAggiornamento": "2022-12-21T09:02:14.4451",
  88. "dataDisabilitazione": null,
  89. "abilitato": true,
  90. "assegnazione": null,
  91. "operatoreCorrente": {
  92. "codiceFiscale": "YNDKPR83A07I282K",
  93. "nome": "SUPERADMIN",
  94. "cognome": "ZERODD",
  95. "email": "superadmin@zerodd.it",
  96. "dataCreazione": "2022-12-14T16:30:02.02323",
  97. "dataAggiornamento": "2022-12-14T16:48:30.933103",
  98. "abilitazioneEmail": true,
  99. "tipo": "SUPERPOTERI",
  100. "hibernateLazyInitializer": {
  101. }
  102. }
  103. }
  104. },
  105. {
  106. "id": 7,
  107. "alias": "BOAZ03.2",
  108. "descrizione": "ISTANZA VALUTATA-INAMMISSIBILE",
  109. "dataCreazione": "2022-12-21T09:02:54.895132",
  110. "dataAggiornamento": "2022-12-21T09:02:54.8951",
  111. "dataDisabilitazione": null,
  112. "abilitato": true,
  113. "attivita": {
  114. "id": 5,
  115. "alias": "BOAZ03",
  116. "descrizione": "ISTANZA VALUTATA",
  117. "dataCreazione": "2022-12-21T09:02:14.445142",
  118. "dataAggiornamento": "2022-12-21T09:02:14.4451",
  119. "dataDisabilitazione": null,
  120. "abilitato": true,
  121. "assegnazione": null,
  122. "operatoreCorrente": {
  123. "codiceFiscale": "YNDKPR83A07I282K",
  124. "nome": "SUPERADMIN",
  125. "cognome": "ZERODD",
  126. "email": "superadmin@zerodd.it",
  127. "dataCreazione": "2022-12-14T16:30:02.02323",
  128. "dataAggiornamento": "2022-12-14T16:48:30.933103",
  129. "abilitazioneEmail": true,
  130. "tipo": "SUPERPOTERI",
  131. "hibernateLazyInitializer": {
  132. }
  133. }
  134. }
  135. }]

and i need to get the following tree JSON:

  1. [{
  2. "id": 2,
  3. "alias": "BOAZ01",
  4. "descrizione": "ISTANZA DA VALUTARE",
  5. "dataCreazione": "2022-12-21T09:01:09.972819",
  6. "dataAggiornamento": "2022-12-21T09:01:09.972776",
  7. "dataDisabilitazione": null,
  8. "abilitato": true,
  9. "children": [
  10. {
  11. "id": 4,
  12. "alias": "BOAZ02",
  13. "descrizione": "ISTANZA IN VALUTAZIONE",
  14. "dataCreazione": "2022-12-21T09:01:58.87955",
  15. "dataAggiornamento": "2022-12-21T09:01:58.879506",
  16. "dataDisabilitazione": null,
  17. "abilitato": true,
  18. "children": [
  19. {
  20. "id": 5,
  21. "alias": "BOAZ03",
  22. "descrizione": "ISTANZA VALUTATA",
  23. "dataCreazione": "2022-12-21T09:02:14.445142",
  24. "dataAggiornamento": "2022-12-21T09:02:14.4451",
  25. "dataDisabilitazione": null,
  26. "abilitato": true,
  27. "children": [
  28. {
  29. "id": 6,
  30. "alias": "BOAZ03.1",
  31. "descrizione": "ISTANZA VALUTATA-AMMISSIBILE",
  32. "dataCreazione": "2022-12-21T09:02:40.046325",
  33. "dataAggiornamento": "2022-12-21T09:02:40.046285",
  34. "dataDisabilitazione": null,
  35. "abilitato": true
  36. },
  37. {
  38. "id": 7,
  39. "alias": "BOAZ03.2",
  40. "descrizione": "ISTANZA VALUTATA-INAMMISSIBILE",
  41. "dataCreazione": "2022-12-21T09:02:54.895132",
  42. "dataAggiornamento": "2022-12-21T09:02:54.8951",
  43. "dataDisabilitazione": null,
  44. "abilitato": true
  45. }
  46. ]
  47. }
  48. ]
  49. }
  50. ]}]

I've already got to transform the following Json into a tree structure, using the following code:

  1. const nest = (items, id = null, link = 'parent_id') =>
  2. items
  3. .filter(item => item
    === id)
  4. .map(item => ({ ...item, children: nest(items, item.id) }));
  5. console.log(
  6. nest(comments)
  7. )

on a simpler structure like the following:

  1. const comments = [{
  2. id: 1,
  3. parent_id: null
  4. }, {
  5. id: 2,
  6. parent_id: 1
  7. }, {
  8. id: 3,
  9. parent_id: 1
  10. }, {
  11. id: 4,
  12. parent_id: 2
  13. }, {
  14. id: 5,
  15. parent_id: 4
  16. }];

but it rightfully can't work since the properties are nested in recursive objects.

Some advice?
Thank you all.

答案1

得分: 1

你可以首先构建一个地图,该地图存储目标对象(不包括 attivita 属性),以它们的 id 为键。然后再次遍历数据,将子对象放置在其父对象的 children 数组中。

  1. function makeHierarchy(response) {
  2. const children = []; // 顶层节点
  3. const map = new Map(response.map(({attivita, ...item}) => [item.id, item]))
  4. .set(undefined, {children}); // 用于虚拟根的条目
  5. for (const { id, attivita } of response) {
  6. (map.get(attivita?.id).children ??= []).push(map.get(id));
  7. }
  8. return children;
  9. }
  10. // 问题中使用的示例数据:
  11. const response = [{"id": 2,"alias": "BOAZ01","descrizione": "ISTANZA DA VALUTARE","dataCreazione": "2022-12-21T09:01:09.972819","dataAggiornamento": "2022-12-21T09:01:09.972776","dataDisabilitazione": null,"abilitato": true,"attivita": null},{"id": 4,"alias": "BOAZ02","descrizione": "ISTANZA IN VALUTAZIONE","dataCreazione": "2022-12-21T09:01:58.87955","dataAggiornamento": "2022-12-21T09:01:58.879506","dataDisabilitazione": null,"abilitato": true,"attivita": {"id": 2,"alias": "BOAZ01","descrizione": "ISTANZA DA VALUTARE","dataCreazione": "2022-12-21T09:01:09.972819","dataAggiornamento": "2022-12-21T09:01:09.972776","dataDisabilitazione": null,"abilitato": true,"assegnazione": null,"operatoreCorrente": {"codiceFiscale": "YNDKPR83A07I282K","nome": "SUPERADMIN","cognome": "ZERODD","email": "superadmin@zerodd.it","dataCreazione": "2022-12-14T16:30:02.02323","dataAggiornamento": "2022-12-14T16:48:30.933103","abilitazioneEmail": true,"tipo": "SUPERPOTERI","hibernateLazyInitializer": {}}}},{"id": 5,"alias": "BOAZ03","descrizione": "ISTANZA VALUTATA","dataCreazione": "2022-12-21T09:02:14.445142","dataAggiornamento": "2022-12-21T09:02:14.4451","dataDisabilitazione": null,"abilitato": true,"attivita": {"id": 4,"alias": "BOAZ02","descrizione": "ISTANZA IN VALUTAZIONE","dataCreazione": "2022-12-21T09:01:58.87955","dataAggiornamento": "2022-12-21T09:01:58.879506","dataDisabilitazione": null,"abilitato": true,"assegnazione": null,"operatoreCorrente": {"codiceFiscale": "YNDKPR83A07I282K","nome": "SUPERADMIN","cognome": "ZERODD","email": "superadmin@zerodd.it","dataCreazione": "2022-12-14T16:30:02.02323","dataAggiornamento": "2022-12-14T16:48:30.933103","abilitazioneEmail": true,"tipo": "SUPERPOTERI","hibernateLazyInitializer": {}}},{"id": 6,"alias": "BOAZ03.1","descrizione": "ISTANZA VALUTATA-AMMISSIBILE","dataCreazione": "2022-12-21T09:02:40.046325","dataAggiornamento": "2022-12-21T09:02:40.046285","dataDisabilitazione": null,"abilitato": true,"attivita": {"id": 5,"alias": "BOAZ03","descrizione": "ISTANZA VALUTATA","dataCreazione": "2022-12-21T09:02:14.445142","dataAggiornamento": "2022-12-21T09:02:14.4451","dataDisabilitazione": null,"abilitato": true,"assegnazione": null,"operatoreCorrente": {"codiceFiscale": "YNDKPR83A07I282K","nome": "SUPERADMIN","cognome": "ZERODD","email": "superadmin@zerodd.it","dataCreazione": "2022-12-14T16:30:02.02323","dataAggiornamento": "2022-12-14T16:48:30.933103","abilitazioneEmail": true,"tipo": "SUPERPOTERI","hibernateLazyInitializer": {}}},{"id": 7,"alias": "BOAZ03.2","descrizione": "ISTANZA VALUTATA-INAMMISSIBILE","dataCreazione": "2022-12-21T09:02:54.895132","dataAggiornamento": "2022-12-21T09:02:54.8951","dataDisabilitazione": null,"abilitato": true,"attivita": {"id": 5,"alias": "BOAZ03","descrizione": "ISTANZA VALUTATA","dataCreazione": "2022-12-21T09:02:14.445142","dataAggiornamento": "2022-12-21T09:02:14.4451","dataDisabilitazione": null,"abilitato": true,"assegnazione": null,"operatoreCorrente": {"codiceFiscale": "YNDKPR83A07I282K","nome": "SUPERADMIN","cognome": "ZERODD","email": "superadmin@zerodd.it","dataCreazione": "2022-12-14T16:30:02.02323","dataAggiornamento": "2022-12-14T16:48:30.933103","abilitazioneEmail": true,"tipo": "SUPERPOTERI","hibernateLazyInitializer": {}}}];
  12. const forest = makeHierarchy(response);
  13. console.log(forest);

这是给定代码的翻译部分。

英文:

You could first build a map that stores the target objects (without attivita properties) keyed by their id. The traverse the data again to place a child in its parent's children array.

<!-- begin snippet: js hide: false console: true babel: false -->

<!-- language: lang-js -->

  1. function makeHierarchy(response) {
  2. const children = []; // Top-level nodes
  3. const map = new Map(response.map(({attivita, ...item}) =&gt; [item.id, item]))
  4. .set(undefined, {children}); // Entry for virtual root
  5. for (const { id, attivita } of response) {
  6. (map.get(attivita?.id).children ??= []).push(map.get(id));
  7. }
  8. return children;
  9. }
  10. // The data example used in the question:
  11. const response = [{&quot;id&quot;: 2,&quot;alias&quot;: &quot;BOAZ01&quot;,&quot;descrizione&quot;: &quot;ISTANZA DA VALUTARE&quot;,&quot;dataCreazione&quot;: &quot;2022-12-21T09:01:09.972819&quot;,&quot;dataAggiornamento&quot;: &quot;2022-12-21T09:01:09.972776&quot;,&quot;dataDisabilitazione&quot;: null,&quot;abilitato&quot;: true,&quot;attivita&quot;: null},{&quot;id&quot;: 4,&quot;alias&quot;: &quot;BOAZ02&quot;,&quot;descrizione&quot;: &quot;ISTANZA IN VALUTAZIONE&quot;,&quot;dataCreazione&quot;: &quot;2022-12-21T09:01:58.87955&quot;,&quot;dataAggiornamento&quot;: &quot;2022-12-21T09:01:58.879506&quot;,&quot;dataDisabilitazione&quot;: null,&quot;abilitato&quot;: true,&quot;attivita&quot;: {&quot;id&quot;: 2,&quot;alias&quot;: &quot;BOAZ01&quot;,&quot;descrizione&quot;: &quot;ISTANZA DA VALUTARE&quot;,&quot;dataCreazione&quot;: &quot;2022-12-21T09:01:09.972819&quot;,&quot;dataAggiornamento&quot;: &quot;2022-12-21T09:01:09.972776&quot;,&quot;dataDisabilitazione&quot;: null,&quot;abilitato&quot;: true,&quot;assegnazione&quot;: null,&quot;operatoreCorrente&quot;: {&quot;codiceFiscale&quot;: &quot;YNDKPR83A07I282K&quot;,&quot;nome&quot;: &quot;SUPERADMIN&quot;,&quot;cognome&quot;: &quot;ZERODD&quot;,&quot;email&quot;: &quot;superadmin@zerodd.it&quot;,&quot;dataCreazione&quot;: &quot;2022-12-14T16:30:02.02323&quot;,&quot;dataAggiornamento&quot;: &quot;2022-12-14T16:48:30.933103&quot;,&quot;abilitazioneEmail&quot;: true,&quot;tipo&quot;: &quot;SUPERPOTERI&quot;,&quot;hibernateLazyInitializer&quot;: {}}}},{&quot;id&quot;: 5,&quot;alias&quot;: &quot;BOAZ03&quot;,&quot;descrizione&quot;: &quot;ISTANZA VALUTATA&quot;,&quot;dataCreazione&quot;: &quot;2022-12-21T09:02:14.445142&quot;,&quot;dataAggiornamento&quot;: &quot;2022-12-21T09:02:14.4451&quot;,&quot;dataDisabilitazione&quot;: null,&quot;abilitato&quot;: true,&quot;attivita&quot;: {&quot;id&quot;: 4,&quot;alias&quot;: &quot;BOAZ02&quot;,&quot;descrizione&quot;: &quot;ISTANZA IN VALUTAZIONE&quot;,&quot;dataCreazione&quot;: &quot;2022-12-21T09:01:58.87955&quot;,&quot;dataAggiornamento&quot;: &quot;2022-12-21T09:01:58.879506&quot;,&quot;dataDisabilitazione&quot;: null,&quot;abilitato&quot;: true,&quot;assegnazione&quot;: null,&quot;operatoreCorrente&quot;: {&quot;codiceFiscale&quot;: &quot;YNDKPR83A07I282K&quot;,&quot;nome&quot;: &quot;SUPERADMIN&quot;,&quot;cognome&quot;: &quot;ZERODD&quot;,&quot;email&quot;: &quot;superadmin@zerodd.it&quot;,&quot;dataCreazione&quot;: &quot;2022-12-14T16:30:02.02323&quot;,&quot;dataAggiornamento&quot;: &quot;2022-12-14T16:48:30.933103&quot;,&quot;abilitazioneEmail&quot;: true,&quot;tipo&quot;: &quot;SUPERPOTERI&quot;,&quot;hibernateLazyInitializer&quot;: {}}}},{&quot;id&quot;: 6,&quot;alias&quot;: &quot;BOAZ03.1&quot;,&quot;descrizione&quot;: &quot;ISTANZA VALUTATA-AMMISSIBILE&quot;,&quot;dataCreazione&quot;: &quot;2022-12-21T09:02:40.046325&quot;,&quot;dataAggiornamento&quot;: &quot;2022-12-21T09:02:40.046285&quot;,&quot;dataDisabilitazione&quot;: null,&quot;abilitato&quot;: true,&quot;attivita&quot;: {&quot;id&quot;: 5,&quot;alias&quot;: &quot;BOAZ03&quot;,&quot;descrizione&quot;: &quot;ISTANZA VALUTATA&quot;,&quot;dataCreazione&quot;: &quot;2022-12-21T09:02:14.445142&quot;,&quot;dataAggiornamento&quot;: &quot;2022-12-21T09:02:14.4451&quot;,&quot;dataDisabilitazione&quot;: null,&quot;abilitato&quot;: true,&quot;assegnazione&quot;: null,&quot;operatoreCorrente&quot;: {&quot;codiceFiscale&quot;: &quot;YNDKPR83A07I282K&quot;,&quot;nome&quot;: &quot;SUPERADMIN&quot;,&quot;cognome&quot;: &quot;ZERODD&quot;,&quot;email&quot;: &quot;superadmin@zerodd.it&quot;,&quot;dataCreazione&quot;: &quot;2022-12-14T16:30:02.02323&quot;,&quot;dataAggiornamento&quot;: &quot;2022-12-14T16:48:30.933103&quot;,&quot;abilitazioneEmail&quot;: true,&quot;tipo&quot;: &quot;SUPERPOTERI&quot;,&quot;hibernateLazyInitializer&quot;: {}}}},{&quot;id&quot;: 7,&quot;alias&quot;: &quot;BOAZ03.2&quot;,&quot;descrizione&quot;: &quot;ISTANZA VALUTATA-INAMMISSIBILE&quot;,&quot;dataCreazione&quot;: &quot;2022-12-21T09:02:54.895132&quot;,&quot;dataAggiornamento&quot;: &quot;2022-12-21T09:02:54.8951&quot;,&quot;dataDisabilitazione&quot;: null,&quot;abilitato&quot;: true,&quot;attivita&quot;: {&quot;id&quot;: 5,&quot;alias&quot;: &quot;BOAZ03&quot;,&quot;descrizione&quot;: &quot;ISTANZA VALUTATA&quot;,&quot;dataCreazione&quot;: &quot;2022-12-21T09:02:14.445142&quot;,&quot;dataAggiornamento&quot;: &quot;2022-12-21T09:02:14.4451&quot;,&quot;dataDisabilitazione&quot;: null,&quot;abilitato&quot;: true,&quot;assegnazione&quot;: null,&quot;operatoreCorrente&quot;: {&quot;codiceFiscale&quot;: &quot;YNDKPR83A07I282K&quot;,&quot;nome&quot;: &quot;SUPERADMIN&quot;,&quot;cognome&quot;: &quot;ZERODD&quot;,&quot;email&quot;: &quot;superadmin@zerodd.it&quot;,&quot;dataCreazione&quot;: &quot;2022-12-14T16:30:02.02323&quot;,&quot;dataAggiornamento&quot;: &quot;2022-12-14T16:48:30.933103&quot;,&quot;abilitazioneEmail&quot;: true,&quot;tipo&quot;: &quot;SUPERPOTERI&quot;,&quot;hibernateLazyInitializer&quot;: {}}}}];
  12. const forest = makeHierarchy(response);
  13. console.log(forest);

<!-- end snippet -->

答案2

得分: 1

你可以采用单循环方法,通过将节点和父节点作为彼此的参考,获取没有父节点的节点。

  1. const data = [
  2. { id: 2, alias: "BOAZ01", descrizione: "ISTANZA DA VALUTARE", dataCreazione: "2022-12-21T09:01:09.972819", dataAggiornamento: "2022-12-21T09:01:09.972776", dataDisabilitazione: null, abilitato: true, attivita: null },
  3. { id: 4, alias: "BOAZ02", descrizione: "ISTANZA IN VALUTAZIONE", dataCreazione: "2022-12-21T09:01:58.87955", dataAggiornamento: "2022-12-21T09:01:58.879506", dataDisabilitazione: null, abilitato: true, attivita: { id: 2, alias: "BOAZ01", descrizione: "ISTANZA DA VALUTARE", dataCreazione: "2022-12-21T09:01:09.972819", dataAggiornamento: "2022-12-21T09:01:09.972776", dataDisabilitazione: null, abilitato: true, assegnazione: null, operatoreCorrente: { codiceFiscale: "YNDKPR83A07I282K", nome: "SUPERADMIN", cognome: "ZERODD", email: "superadmin@zerodd.it", dataCreazione: "2022-12-14T16:30:02.02323", dataAggiornamento: "2022-12-14T16:48:30.933103", abilitazioneEmail: true, tipo: "SUPERPOTERI", hibernateLazyInitializer: {} } }
  4. },
  5. { id: 5, alias: "BOAZ03", descrizione: "ISTANZA VALUTATA", dataCreazione: "2022-12-21T09:02:14.445142", dataAggiornamento: "2022-12-21T09:02:14.4451", dataDisabilitazione: null, abilitato: true, attivita: { id: 4, alias: "BOAZ02", descrizione: "ISTANZA IN VALUTAZIONE", dataCreazione: "2022-12-21T09:01:58.87955", dataAggiornamento: "2022-12-21T09:01:58.879506", dataDisabilitazione: null, abilitato: true, assegnazione: null, operatoreCorrente: { codiceFiscale: "YNDKPR83A07I282K", nome: "SUPERADMIN", cognome: "ZERODD", email: "superadmin@zerodd.it", dataCreazione: "2022-12-14T16:30:02.02323", dataAggiornamento: "2022-12-14T16:48:30.933103", abilitazioneEmail: true, tipo: "SUPERPOTERI", hibernateLazyInitializer: {} } }
  6. },
  7. { id: 6, alias: "BOAZ03.1", descrizione: "ISTANZA VALUTATA-AMMISSIBILE", dataCreazione: "2022-12-21T09:02:40.046325", dataAggiornamento: "2022-12-21T09:02:40.046285", dataDisabilitazione: null, abilitato: true, attivita: { id: 5, alias: "BOAZ03", descrizione: "ISTANZA VALUTATA", dataCreazione: "2022-12-21T09:02:14.445142", dataAggiornamento: "2022-12-21T09:02:14.4451", dataDisabilitazione: null, abilitato: true, assegnazione: null, operatoreCorrente: { codiceFiscale: "YNDKPR83A07I282K", nome: "SUPERADMIN", cognome: "ZERODD", email: "superadmin@zerodd.it", dataCreazione: "2022-12-14T16:30:02.02323", dataAggiornamento: "2022-12-14T16:48:30.933103", abilitazioneEmail: true, tipo: "SUPERPOTERI", hibernateLazyInitializer: {} } }
  8. },
  9. { id: 7, alias: "BOAZ03.2", descrizione: "ISTANZA VALUTATA-INAMMISSIBILE", dataCreazione: "2022-12-21T09:02:54.895132", dataAggiornamento: "2022-12-21T09:02:54.8951", dataDisabilitazione: null, abilitato: true, attivita: { id: 5, alias: "BOAZ03", descrizione: "ISTANZA VALUTATA", dataCreazione: "2022-12-21T09:02:14.445142", dataAggiornamento: "2022-12-21T09:02:14.4451", dataDisabilitazione: null, abilitato: true, assegnazione: null, operatoreCorrente: { codiceFiscale: "YNDKPR83A07I282K", nome: "SUPERADMIN", cognome: "ZERODD", email: "superadmin@zerodd.it", dataCreazione: "2022-12-14T16:30:02.02323", dataAggiornamento: "2022-12-14T16:48:30.933103", abilitazioneEmail: true, tipo: "SUPERPOTERI", hibernateLazyInitializer: {} } }
  10. }
  11. ];
  12. const tree = data
  13. .reduce((t, { attivita, ...o }) => {
  14. const parent = attivita?.id ?? 'root';
  15. Object.assign(t[o.id] = t[o.id] || {}, o);
  16. ((t[parent] ??= {}).children ??= []).push(t[o.id]);
  17. return t;
  18. }, {})
  19. .root
  20. .children;
  21. console.log(tree);

希望这有所帮助。

英文:

You could take a single loop approach by taking node and parent nodes as reference to each other and get the nodes without having parent nodes.

<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-js -->
const
data = [{ id: 2, alias: "BOAZ01", descrizione: "ISTANZA DA VALUTARE", dataCreazione: "2022-12-21T09:01:09.972819", dataAggiornamento: "2022-12-21T09:01:09.972776", dataDisabilitazione: null, abilitato: true, attivita: null }, { id: 4, alias: "BOAZ02", descrizione: "ISTANZA IN VALUTAZIONE", dataCreazione: "2022-12-21T09:01:58.87955", dataAggiornamento: "2022-12-21T09:01:58.879506", dataDisabilitazione: null, abilitato: true, attivita: { id: 2, alias: "BOAZ01", descrizione: "ISTANZA DA VALUTARE", dataCreazione: "2022-12-21T09:01:09.972819", dataAggiornamento: "2022-12-21T09:01:09.972776", dataDisabilitazione: null, abilitato: true, assegnazione: null, operatoreCorrente: { codiceFiscale: "YNDKPR83A07I282K", nome: "SUPERADMIN", cognome: "ZERODD", email: "superadmin@zerodd.it", dataCreazione: "2022-12-14T16:30:02.02323", dataAggiornamento: "2022-12-14T16:48:30.933103", abilitazioneEmail: true, tipo: "SUPERPOTERI", hibernateLazyInitializer: {} } } }, { id: 5, alias: "BOAZ03", descrizione: "ISTANZA VALUTATA", dataCreazione: "2022-12-21T09:02:14.445142", dataAggiornamento: "2022-12-21T09:02:14.4451", dataDisabilitazione: null, abilitato: true, attivita: { id: 4, alias: "BOAZ02", descrizione: "ISTANZA IN VALUTAZIONE", dataCreazione: "2022-12-21T09:01:58.87955", dataAggiornamento: "2022-12-21T09:01:58.879506", dataDisabilitazione: null, abilitato: true, assegnazione: null, operatoreCorrente: { codiceFiscale: "YNDKPR83A07I282K", nome: "SUPERADMIN", cognome: "ZERODD", email: "superadmin@zerodd.it", dataCreazione: "2022-12-14T16:30:02.02323", dataAggiornamento: "2022-12-14T16:48:30.933103", abilitazioneEmail: true, tipo: "SUPERPOTERI", hibernateLazyInitializer: {} } } }, { id: 6, alias: "BOAZ03.1", descrizione: "ISTANZA VALUTATA-AMMISSIBILE", dataCreazione: "2022-12-21T09:02:40.046325", dataAggiornamento: "2022-12-21T09:02:40.046285", dataDisabilitazione: null, abilitato: true, attivita: { id: 5, alias: "BOAZ03", descrizione: "ISTANZA VALUTATA", dataCreazione: "2022-12-21T09:02:14.445142", dataAggiornamento: "2022-12-21T09:02:14.4451", dataDisabilitazione: null, abilitato: true, assegnazione: null, operatoreCorrente: { codiceFiscale: "YNDKPR83A07I282K", nome: "SUPERADMIN", cognome: "ZERODD", email: "superadmin@zerodd.it", dataCreazione: "2022-12-14T16:30:02.02323", dataAggiornamento: "2022-12-14T16:48:30.933103", abilitazioneEmail: true, tipo: "SUPERPOTERI", hibernateLazyInitializer: {} } } }, { id: 7, alias: "BOAZ03.2", descrizione: "ISTANZA VALUTATA-INAMMISSIBILE", dataCreazione: "2022-12-21T09:02:54.895132", dataAggiornamento: "2022-12-21T09:02:54.8951", dataDisabilitazione: null, abilitato: true, attivita: { id: 5, alias: "BOAZ03", descrizione: "ISTANZA VALUTATA", dataCreazione: "2022-12-21T09:02:14.445142", dataAggiornamento: "2022-12-21T09:02:14.4451", dataDisabilitazione: null, abilitato: true, assegnazione: null, operatoreCorrente: { codiceFiscale: "YNDKPR83A07I282K", nome: "SUPERADMIN", cognome: "ZERODD", email: "superadmin@zerodd.it", dataCreazione: "2022-12-14T16:30:02.02323", dataAggiornamento: "2022-12-14T16:48:30.933103", abilitazioneEmail: true, tipo: "SUPERPOTERI", hibernateLazyInitializer: {} } } }],
tree = data
.reduce((t, { attivita, ...o }) => {
const parent = attivita?.id ?? 'root';
Object.assign(t[o.id] = t[o.id] || {}, o);
((t[parent] ??= {}).children ??= []).push(t[o.id]);
return t;
}, {})
.root
.children;

  1. console.log(tree);

<!-- language: lang-css -->
.as-console-wrapper { max-height: 100% !important; top: 0; }
<!-- end snippet -->

huangapple
  • 本文由 发表于 2023年3月8日 19:12:47
  • 转载请务必保留本文链接:https://go.coder-hub.com/75672270.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定