簡體   English   中英

如何將具有存儲為鍵值對象的節點的樹轉換為具有存儲為 Javascript 中的對象數組的節點的樹結構?

[英]How to convert tree having nodes stored as key-value objects to a tree structure having nodes stored as array of objects in Javascript?

我正在嘗試將具有存儲為鍵值對象的節點的樹結構轉換為具有存儲為對象數組的節點的樹結構。 我怎樣才能實現它?

示例:我想轉換此結構:

const treeX = [
  {
    id: '7d2a730a-53b7-4ce6-b791-446a7dc3d97e',
    name: 'category1',
    nodes: {
      'd043f4bd-6d3f-478c-b4ea-a5fc1ad66fb1': {
        name: 'subcategory2',
        id: 'd043f4bd-6d3f-478c-b4ea-a5fc1ad66fb1',
        nodes: {
          '69c7481d-d8c3-41da-b8fa-84d6056f6344': {
            name: 'subsubcategory3',
            id: '69c7481d-d8c3-41da-b8fa-84d6056f6344',
            nodes: {},
          },
          '184e0b3d-108c-45ee-8c62-a81b73bf5b7b': {
            name: 'subsubcategory4',
            id: '184e0b3d-108c-45ee-8c62-a81b73bf5b7b',
            nodes: {},
          },
        },
      },
      '0ec9a897-6e06-4c06-a780-b37ce8fd51f7': {
        name: 'subcategory5',
        id: '0ec9a897-6e06-4c06-a780-b37ce8fd51f7',
        nodes: {
          '9531f8d4-0d28-4a89-8d4e-ddd3ceea4939': {
            name: 'subsubcategory6',
            id: '9531f8d4-0d28-4a89-8d4e-ddd3ceea4939',
            nodes: {},
          },
          '2f32f5b8-0abb-48e1-b6ad-b7f00aba02ca': {
            name: 'subsubcategory7',
            id: '2f32f5b8-0abb-48e1-b6ad-b7f00aba02ca',
            nodes: {},
          },
        },
      },
    },
  },
  {
    id: '985ab20a-53b7-4ce6-b791-446a7dc3d97e',
    name: 'category8',
    nodes: {
      '26b97abd-6d3f-478c-b4ea-a5fc1ad66fb1': {
        name: 'subcategory9',
        id: '236b45bd-6d3f-478c-b4ea-a5fc1ad66fb1',
        nodes: {},
      },
    },
  },
];

至:

const treeY = [
  {
    id: '7d2a730a-53b7-4ce6-b791-446a7dc3d97e',
    name: 'category1',
    nodes: [
      {
        name: 'subcategory2',
        id: 'd043f4bd-6d3f-478c-b4ea-a5fc1ad66fb1',
        nodes: [
          {
            name: 'subsubcategory3',
            id: '69c7481d-d8c3-41da-b8fa-84d6056f6344',
            nodes: [],
          },
          {
            name: 'subsubcategory4',
            id: '184e0b3d-108c-45ee-8c62-a81b73bf5b7b',
            nodes: [],
          },
        ],
      },
      {
        name: 'subcategory5',
        id: '0ec9a897-6e06-4c06-a780-b37ce8fd51f7',
        nodes: [
          {
            name: 'subsubcategory6',
            id: '9531f8d4-0d28-4a89-8d4e-ddd3ceea4939',
            nodes: [],
          },
          {
            name: 'subsubcategory7',
            id: '2f32f5b8-0abb-48e1-b6ad-b7f00aba02ca',
            nodes: [],
          },
        ],
      },
    ],
  },
  {
    id: '985ab20a-53b7-4ce6-b791-446a7dc3d97e',
    name: 'category8',
    nodes: [
      {
        name: 'subcategory9',
        id: '236b45bd-6d3f-478c-b4ea-a5fc1ad66fb1',
        nodes: [],
      },
    ],
  },
];

我如何實現它的方式:

categories.forEach(category => {
    category.nodes = Object.values(category.nodes);
    category.nodes?.forEach(subcategory => {
        subcategory.nodes = Object.values(subcategory.nodes);
        subcategory.nodes?.forEach(subsubcategory => {
            subsubcategory.nodes = Object.values(subsubcategory.nodes);
            subsubcategory.nodes?.forEach(subsubsubcategory => {
                subsubsubcategory.nodes = Object.values(subsubsubcategory.nodes)
            })
        })
    })
});

我知道該解決方案絕對無效,如果樹有更多級別,它將無法工作。 因此,我想問一下,如何改進代碼? 也許使用遞歸 function?

在我看來,您真正需要的只是遞歸 map Object.valuesnodes屬性:

 const treeX=[{id:"7d2a730a-53b7-4ce6-b791-446a7dc3d97e",name:"category1",nodes:{"d043f4bd-6d3f-478c-b4ea-a5fc1ad66fb1":{name:"subcategory2",id:"d043f4bd-6d3f-478c-b4ea-a5fc1ad66fb1",nodes:{"69c7481d-d8c3-41da-b8fa-84d6056f6344":{name:"subsubcategory3",id:"69c7481d-d8c3-41da-b8fa-84d6056f6344",nodes:{}},"184e0b3d-108c-45ee-8c62-a81b73bf5b7b":{name:"subsubcategory4",id:"184e0b3d-108c-45ee-8c62-a81b73bf5b7b",nodes:{}}}},"0ec9a897-6e06-4c06-a780-b37ce8fd51f7":{name:"subcategory5",id:"0ec9a897-6e06-4c06-a780-b37ce8fd51f7",nodes:{"9531f8d4-0d28-4a89-8d4e-ddd3ceea4939":{name:"subsubcategory6",id:"9531f8d4-0d28-4a89-8d4e-ddd3ceea4939",nodes:{}},"2f32f5b8-0abb-48e1-b6ad-b7f00aba02ca":{name:"subsubcategory7",id:"2f32f5b8-0abb-48e1-b6ad-b7f00aba02ca",nodes:{}}}}}},{id:"985ab20a-53b7-4ce6-b791-446a7dc3d97e",name:"category8",nodes:{"26b97abd-6d3f-478c-b4ea-a5fc1ad66fb1":{name:"subcategory9",id:"236b45bd-6d3f-478c-b4ea-a5fc1ad66fb1",nodes:{}}}}]; const transformObj = (obj) => ({...obj, nodes: Object.values(obj.nodes).map(transformObj) }); const result = treeX.map(transformObj); console.log(result);

暫無
暫無

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

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