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

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

Build tree array from flat object array in typescript

问题

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

const nest = (items, id = null, link = 'parent_id') =>
  items
    .filter(item => item[link] === id)
    .map(item => ({ ...item, children: nest(items, item.id) }));

console.log(
  nest(comments)
)

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

英文:

I have the following JSON:

 "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": {

      }
    }
  }
}]

and i need to get the following tree JSON:

[{
"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,
"children": [
  {
    "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,
    "children": [
      {
        "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,
        "children": [
          {
            "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
          },
          {
            "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
          }
        ]
      }
    ]
  }
]}]

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

 const nest = (items, id = null, link = 'parent_id') =>
  items
    .filter(item => item
=== id) .map(item => ({ ...item, children: nest(items, item.id) })); console.log( nest(comments) )

on a simpler structure like the following:

const comments = [{
    id: 1,
    parent_id: null
}, {
    id: 2,
    parent_id: 1
}, {
    id: 3,
    parent_id: 1
}, {
    id: 4,
    parent_id: 2
}, {
    id: 5,
    parent_id: 4
}];

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

Some advice?
Thank you all.

答案1

得分: 1

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

function makeHierarchy(response) {
    const children = []; // 顶层节点
    const map = new Map(response.map(({attivita, ...item}) => [item.id, item]))
                .set(undefined, {children}); // 用于虚拟根的条目
    for (const { id, attivita } of response) {
        (map.get(attivita?.id).children ??= []).push(map.get(id));
    }
    return children;
}

// 问题中使用的示例数据:
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": {}}}];
const forest = makeHierarchy(response);
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 -->

function makeHierarchy(response) {
const children = []; // Top-level nodes
const map = new Map(response.map(({attivita, ...item}) =&gt; [item.id, item]))
.set(undefined, {children}); // Entry for virtual root
for (const { id, attivita } of response) {
(map.get(attivita?.id).children ??= []).push(map.get(id));
}
return children;
}
// The data example used in the question:
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;: {}}}}];
const forest = makeHierarchy(response);
console.log(forest);

<!-- end snippet -->

答案2

得分: 1

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

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: {} } }
  }
];

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

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;

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:

确定