SOURCE

const data = [
    {
        id: "17",
        node_name: "根节点",
        node_path: "0",
        is_last_node: "0",
        parent_id: "0",
        remark: "测试",
        children: [
            {
                id: "1",
                node_name: "测试节点1",
                node_path: "17",
                is_last_node: "0",
                parent_id: "17",
                remark: "",
                children: [
                    {
                        id: "5",
                        node_name: "测试子节点1",
                        node_path: "0/1",
                        is_last_node: "0",
                        parent_id: "1",
                        remark: "",
                        children: [
                            {
                                id: "9",
                                node_name:
                                    "测试末级节点的父节点1",
                                node_path: "0/1/5",
                                is_last_node: "0",
                                parent_id: "5",
                                remark: "",
                                children: [
                                    {
                                        id: "14",
                                        node_name:
                                            "测试末级节点1",
                                        node_path: "0/1/5/9",
                                        is_last_node: "1",
                                        parent_id: "9",
                                        remark: "",
                                        sum: 2, //合计数量
                                        pass_info: [
                                            //出入园数据
                                            {
                                                cnt: 4, //数量
                                                tid: 12312312, //票id
                                                node_id: 11, //节点id
                                                ticket_name: "票A", //票名称
                                            },
                                            {
                                                cnt: 1,
                                                tid: 12312321,
                                                node_id: 11,
                                                ticket_name: "票B",
                                            },
                                        ],
                                    },
                                    {
                                        id: "27",
                                        node_name:
                                            "测试末级节点1",
                                        node_path: "0/1/5/9",
                                        is_last_node: "1",
                                        parent_id: "9",
                                        remark: "",
                                    },
                                ],
                            },
                            {
                                id: "10",
                                node_name:
                                    "测试末级节点的父节点2",
                                node_path: "0/1/5",
                                is_last_node: "0",
                                parent_id: "5",
                                remark: "",
                                children: [
                                    {
                                        id: "15",
                                        node_name:
                                            "测试末级节点2",
                                        node_path: "0/1/5/10",
                                        is_last_node: "1",
                                        parent_id: "10",
                                        remark: "123",
                                    },
                                ],
                            },
                            {
                                id: "11",
                                node_name:
                                    "测试末级节点的父节点3",
                                node_path: "0/1/5",
                                is_last_node: "1",
                                parent_id: "5",
                                remark: "",
                                sum: 2, //合计数量
                                pass_info: [
                                    //出入园数据
                                    {
                                        cnt: 1, //数量
                                        tid: 12312312, //票id
                                        node_id: 11, //节点id
                                        ticket_name: "票A", //票名称
                                    },
                                    {
                                        cnt: 1,
                                        tid: 12312321,
                                        node_id: 11,
                                        ticket_name: "票B",
                                    },
                                ],
                            },
                        ],
                    },
                    {
                        id: "6",
                        node_name: "测试子节点2",
                        node_path: "0/1",
                        is_last_node: "0",
                        parent_id: "1",
                        remark: "",
                        children: [
                            {
                                id: "12",
                                node_name: "测试子节的子节点1",
                                node_path: "0/1/6",
                                is_last_node: "0",
                                parent_id: "6",
                                remark: "",
                                children: [],
                            },
                            {
                                id: "13",
                                node_name: "测试子节的子节点2",
                                node_path: "0/1/6",
                                is_last_node: "0",
                                parent_id: "6",
                                remark: "",
                                children: [],
                            },
                        ],
                    },
                    {
                        id: "7",
                        node_name: "测试子节点3",
                        node_path: "0/1",
                        is_last_node: "0",
                        parent_id: "1",
                        remark: "",
                        children: [],
                    },
                    {
                        id: "8",
                        node_name: "测试子节点4",
                        node_path: "0/1",
                        is_last_node: "0",
                        parent_id: "1",
                        remark: "",
                        children: [],
                    },
                ],
            },
            {
                id: "2",
                node_name: "测试节点2",
                node_path: "17",
                is_last_node: "0",
                parent_id: "17",
                remark: "",
                children: [],
            },
            {
                id: "3",
                node_name: "测试节点3",
                node_path: "17",
                is_last_node: "0",
                parent_id: "17",
                remark: "",
                children: [
                    {
                        id: "16",
                        node_name: "动物园",
                        node_path: "0/3",
                        is_last_node: "0",
                        parent_id: "3",
                        remark: "测试",
                        children: [],
                    },
                ],
            },
            {
                id: "4",
                node_name: "测试节点4",
                node_path: "17",
                is_last_node: "0",
                parent_id: "17",
                remark: "",
                children: [],
            },
        ],
    },
]

const arr1 = [{
    name: 1,
    children: [
        {
            name: 2,
            children: [
                {
                    name: 2,
                    children: []
                },
                {
                    name: 2
                },
                {
                    name: 2
                },
                {
                    name: 2
                },
                {
                    name: 2
                },
                {
                    name: 2
                },
                {
                    name: 2
                },
                {
                    name: 2
                },
                {
                    name: 2
                },
                {
                    name: 2
                },
                {
                    name: 2
                },
                {
                    name: 2
                }
            ]
        },
        {
            name: 3
        },
        {
            name: 4
        }
    ]
}]

const findChild = (data = [], num = 0) => {
    data && data.map(item => {
        if (item.children && item.children.length) {
            num = findChild(item.children, num)
        } else {
            num++;
        }
    })
    return num;
}

console.log(findChild(data[0].children))

const digui = (data = [], level = 0, row = {}, final = [], levels = [], tickets = [], levelSum = {}) => {
    level++;
    data && data.map((item, index) => {
        console.log("index", index, "level", level, "name", item.node_name)
        let currentRow = {
            ...row,
            [`level${level}`]: item.node_name,
            [`node_id${level}`]: item.id,
        };
        if (level === 2) levelSum.level2 = 0;
        if (!levels.includes(level)) levels.push(level);
        if (item.sum) {
            currentRow.sum = item.sum;
            levelSum.level2 += item.sum;
        }
        if (item.pass_info) {
            item.pass_info.forEach(p => {
                currentRow[p.ticket_name] = p.cnt;
                const matchTicket = tickets.find(t => t.tid === p.tid);
                if (!matchTicket) {
                    tickets.push({
                        tid: p.tid,
                        ticket_name: p.ticket_name,
                        cnt: p.cnt
                    })
                } else {
                    matchTicket.cnt += p.cnt;
                }
            })
        }
        // if (item.is_last_node == "0" && item.children) {
        if (item.children && item.children.length) {
            digui(item.children, level, currentRow, final, levels, tickets, levelSum);
        } else {
            final.push({ ...currentRow, type: "num" });
            final.push({ ...currentRow, type: "rate" });
        }
        if (level === 2) {
            final.push({ ...currentRow, level2: "合计", type: "total", sum: levelSum.level2 });
        }
    })
    return { final, levels, tickets };
}

console.log(digui(data))
console 命令行工具 X clear

                    
>
console