如何将嵌套对象数组转换为指定结构的二维数组(Google表格用)
嵌套对象数组转指定二维数组解决方案
问题描述
需要将多层嵌套的对象数组转换为特定格式的二维数组,最终用于Google Spreadsheet逐行写入数据。
原始对象数组结构
const arrayOfObjects = [ { "name": "A", "child": [ { "name": "A1", "child": [ {"name": "A1a"}, {"name": "A1b"}, {"name": "A1c"} ] }, { "name": "A2", "child": [ {"name": "A2a"}, {"name": "A2b"} ] }, { "name": "A3", "child": [ {"name": "A3a"}, {"name": "A3b"}, {"name": "A3c"}, {"name": "A3d"} ] }, { "name": "A4", "child": [ {"name": "A4a"}, {"name": "A4b"}, {"name": "A4c"} ] } ] }, { "name": "B", "child": [ { "name": "B1", "child": [ {"name": "B1a"}, {"name": "B1b"} ] }, { "name": "B2", "child": [ {"name": "B2a"}, {"name": "B2b"} ] }, { "name": "B3", "child": [ {"name": "B3A"}, {"name": "B3b"}, {"name": "B3c"}, {"name": "B3d"}, {"name": "B3e"} ] } ] } // 其他同结构对象 ];
目标二维数组格式
const targetArray = [ ["A","A1","A1a"], ["A1b"], ["A1c"], ["A2","A2a"], ["A2b"], ["A3","A3a"], ["A3b"], ["A3c"], ["A3d"], ["A4","A4a"], ["A4b"], ["A4c"], ["B","B1","B1a"], // 后续同规则项 ];
实际操作中用forEach遍历多层嵌套结构时,没法正确生成这种格式的二维数组。
解决方案:递归遍历处理嵌套结构
多层嵌套的结构用递归处理最省心,核心是维护当前路径的名称数组,遍历到叶子节点时生成对应行,同层级后续的叶子节点只保留自身名称。
实现代码
function convertToTargetArray(data) { const result = []; // 递归处理函数,currentPath记录当前层级的名称链 function traverse(node, currentPath = []) { const newPath = [...currentPath, node.name]; if (node.child && node.child.length > 0) { // 遍历子节点,第一个子节点继承完整路径,后续子节点只带当前父节点名称 node.child.forEach((child, index) => { const pathToPass = index === 0 ? newPath : [node.name]; traverse(child, pathToPass); }); } else { // 叶子节点,把当前路径加入结果 result.push(newPath); } } // 处理顶层每个对象 data.forEach(item => traverse(item)); return result; } // 使用示例 const convertedArray = convertToTargetArray(arrayOfObjects); console.log(convertedArray);
代码逻辑说明
- 递归函数
traverse:负责处理单个节点,参数里的currentPath用来记录从顶层到当前节点的名称链:- 第一个子节点会沿用完整的父路径,比如A→A1→A1a,最终生成
["A","A1","A1a"] - 同层级的其他子节点只保留直接父节点的名称,比如A1的第二个子节点A1b,路径就是
["A1b"]
- 第一个子节点会沿用完整的父路径,比如A→A1→A1a,最终生成
- 叶子节点处理:当节点没有
child或者child为空时,就把当前路径数组加到结果里。 - 顶层遍历:调用递归函数处理原始数组里的每一个顶层对象。
用这个方法转换后,得到的二维数组完全符合需求,直接就能用于Google Spreadsheet的逐行写入。
内容的提问来源于stack exchange,提问作者mthgn
相关产品推荐
相关产品推荐

