为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

我有一个数组:[   { 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没有足够的经验来修改映射函数。
查看完整描述

1 回答

?
偶然的你

TA贡献1841条经验 获得超3个赞

简单的 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: []

                    }

                ]

            }

        ]

    }

]


//DFS

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

}


//BFS

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


查看完整回答
反对 回复 2022-09-29
  • 1 回答
  • 0 关注
  • 70 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信