将嵌套对象的数组排序到单独的数组数组中

我有一个数组:


  { id: 1, 

    name: "parent1", 

    children: [ 

               { id: 10, 

                 name: "first_child_of_id_1", 

                 children: [ 

                            { id: 100, name: "child_of_id_10", children: []},

                            { id: 141, name: "child_of_id_10", children: []}, 

                            { id: 155, name: "child_of_id_10", children: []}

                           ]

               },

               { id: 42, 

                 name: "second_child_of_id_1", 

                 children: [ 

                            { id: 122, name: "child_of_id_42", children: []},

                            { id: 133, name: "child_of_id_42", children: []}, 

                            { id: 177, name: "child_of_id_42", children: []}

                           ]

               }

             ]

  },

  { id: 7, 

    name: "parent7", 

    children: [ 

               { id: 74, 

                 name: "first_child_of_id_7", 

                 children: [ 

                            { id: 700, name: "child_of_id_74", children: []},

                            { id: 732, name: "child_of_id_74", children: []}, 

                            { id: 755, name: "child_of_id_74", children: []}

                           ]

               },

               { id: 80, 

                 name: "second_child_of_id_7", 

                 children: [ 

                            { id: 22, name: "child_of_id_80", children: []},

                            { id: 33, name: "child_of_id_80", children: []}, 

                            { id: 77, name: "child_of_id_80", children: []}

                           ]

               }

             ]

  }

我需要的是一个数组,如下所示:


[

  [ "id", "name", "parent_id", "parent_name" ],

  [  1, "parent1", null, "" ],

  [ 10, "first_child_of_id_1", 1, "parent1"],

  [ 42, "second_child_of_id_1", 1, "parent1"],

  [100, "child_of_id_10", 10, "first_child_of_id_1"]

]

依此类推,所有嵌套对象都可以将它们转换为CSV行。我已经检查了许多答案,并在这里发现了一个类似的问题:如何将嵌套对象数组转换为CSV?但是它为许多嵌套对象生成了太长的行,并且我对JavaScript没有足够的经验来修改映射函数。


慕尼黑的夜晚无繁华
浏览 73回答 1
1回答

偶然的你

简单的 DFS 或 BFS 算法应该可以完成这里的工作。不同之处在于创建“行”的顺序。如果要将给定节点的所有子节点紧跟在其父节点之后列出,则需要使用 BFS。DFS 和断续器的示例:const input = [{        id: 1,        name: "parent1",        children: [{                id: 10,                name: "first_child_of_id_1",                children: [{                        id: 100,                        name: "child_of_id_10",                        children: []                    },                    {                        id: 141,                        name: "child_of_id_10",                        children: []                    },                    {                        id: 155,                        name: "child_of_id_10",                        children: []                    }                ]            },            {                id: 42,                name: "second_child_of_id_1",                children: [{                        id: 122,                        name: "child_of_id_42",                        children: []                    },                    {                        id: 133,                        name: "child_of_id_42",                        children: []                    },                    {                        id: 177,                        name: "child_of_id_42",                        children: []                    }                ]            }        ]    },    {        id: 7,        name: "parent7",        children: [{                id: 74,                name: "first_child_of_id_7",                children: [{                        id: 700,                        name: "child_of_id_74",                        children: []                    },                    {                        id: 732,                        name: "child_of_id_74",                        children: []                    },                    {                        id: 755,                        name: "child_of_id_74",                        children: []                    }                ]            },            {                id: 80,                name: "second_child_of_id_1",                children: [{                        id: 22,                        name: "child_of_id_80",                        children: []                    },                    {                        id: 33,                        name: "child_of_id_80",                        children: []                    },                    {                        id: 77,                        name: "child_of_id_80",                        children: []                    }                ]            }        ]    }]//DFSfunction deepWalk(node, parent, output = []) {    if (!node || typeof node !== 'object' || !node.id) return;    output.push([node.id, node.name, parent ? parent.id : null, parent ? parent.name : ""])    if (node.children) {        for (const child of node.children) {            deepWalk(child, node, output);        }    }    return output;}//BFSfunction broadWalk(root) {    const output = []    const queue = [];    queue.push({        node: root,        parent: null    });    while (queue.length) {        const {            node,            parent        } = queue.shift();        output.push([node.id, node.name, parent ? parent.id : null, parent ? parent.name : ""])        if (node.children) {            for (const child of node.children) {                queue.push({                    node: child,                    parent: node                });            }        }    }    return output;}let rowsDfs = [    ["id", "name", "parent_id", "parent_name"]];let rowsBfs = [    ["id", "name", "parent_id", "parent_name"]];for (const node of input) {    rowsDfs = [...rowsDfs, ...deepWalk(node)];    rowsBfs = [...rowsBfs, ...broadWalk(node)];}console.log("rows DFS: ", rowsDfs)console.log("rows BFS: ", rowsBfs)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript