编写递归函数重构嵌套表格数据结构,提取子表格至同层级
解决方案
核心思路
递归遍历数据结构,将所有嵌套在非表格节点内的type: "table"节点提取到顶级数组中,同时从原父节点移除这些嵌套表格,保留原表格的结构完整性。
实现代码
function flattenNestedTables(root) { const result = []; // 深拷贝原始数据,避免修改原对象 const processedRoot = JSON.parse(JSON.stringify(root)); // 递归提取嵌套表格 extractTables(processedRoot, result); // 将处理后的根表格放在结果数组最前面 result.unshift(processedRoot); return result; } function extractTables(node, result) { // 如果当前节点没有子节点,直接返回 if (!node.children || !Array.isArray(node.children)) return; // 收集需要提取的嵌套表格 const tablesToExtract = []; // 过滤当前节点的子节点,移除表格类型的节点 node.children = node.children.filter(child => { if (child.type === 'table') { tablesToExtract.push(child); return false; } // 递归处理非表格类型的子节点,提取更深层的嵌套表格 extractTables(child, result); return true; }); // 将提取到的表格添加到结果数组,并处理表格内部的嵌套表格 tablesToExtract.forEach(table => { extractTables(table, result); result.push(table); }); }
使用示例
// 原始数据 const originalData = { "key": "parent_table", "title": "parent_table", "type": "table", "children": [ // 此处填入你的原始数据内容 ] }; // 转换数据 const transformedData = flattenNestedTables(originalData); console.log(JSON.stringify(transformedData, null, 2));
代码说明
flattenNestedTables:初始化结果数组,深拷贝根节点防止修改原始数据,调用递归函数提取嵌套表格后,将处理后的根节点加入结果数组头部。extractTables:- 遍历当前节点的子节点,筛选并收集表格类型节点。
- 递归处理非表格子节点,确保深层嵌套的表格也能被提取。
- 将收集到的表格添加到结果数组,同时处理表格内部可能存在的更深层嵌套表格。
内容的提问来源于stack exchange,提问作者tedeeee
相关产品推荐
相关产品推荐

