const getAllColumns = (columns: any, parentColumn?: any) => { const result: any[] = [] columns.forEach((column: any) => { column.parentId = parentColumn ? parentColumn.id : null if (column.visible) { if (column.children && column.children.length && column.children.some((column: any) => column.visible)) { result.push(column) result.push(...getAllColumns(column.children, column)) } else { result.push(column) } } }) return result } export const convertToRows = (originColumns: any): any[][] => { let maxLevel = 1 const traverse = (column: any, parent?: any) => { if (parent) { column.level = parent.level + 1 if (maxLevel < column.level) { maxLevel = column.level } } if (column.children && column.children.length && column.children.some((column: any) => column.visible)) { let colSpan = 0 column.children.forEach((subColumn: any) => { if (subColumn.visible) { traverse(subColumn, column) colSpan += subColumn.colSpan } }) column.colSpan = colSpan } else { column.colSpan = 1 } } originColumns.forEach((column: any) => { column.level = 1 traverse(column) }) const rows: any[] = [] for (let i = 0; i < maxLevel; i++) { rows.push([]) } const allColumns = getAllColumns(originColumns) allColumns.forEach((column) => { if (column.children && column.children.length && column.children.some((column: any) => column.visible)) { column.rowSpan = 1 } else { column.rowSpan = maxLevel - column.level + 1 } rows[column.level - 1].push(column) }) return rows }