嵌套家族树转JSON数组:添加祖父ID及去除全局变量问询
实现方案
可以通过递归扁平化的方式处理嵌套家族树,无需全局变量,直接返回目标JSON数组。核心思路是在递归过程中传递当前节点的parentId和grandparentId,逐层构建每个节点的条目并合并结果。
代码实现
function flattenFamilyTree(node, parentId = null, grandparentId = null) { // 生成当前节点的基础条目 const currentItem = { id: node.id, name: node.name, // 可根据你的实际字段调整 parentId: parentId, grandparentId: grandparentId }; // 递归处理子节点:如果存在children字段,遍历每个子节点并传递父/祖父ID const childItems = node.children ? node.children.flatMap(child => flattenFamilyTree(child, node.id, parentId)) : []; // 合并当前节点和子节点的结果,返回一维数组 return [currentItem, ...childItems]; } // 示例输入 const myObj = { id: 1, name: '祖父', children: [ { id: 2, name: '父亲', children: [ { id: 3, name: '儿子' }, { id: 4, name: '女儿' } ] }, { id: 5, name: '叔伯', children: [{ id: 6, name: '堂弟' }] } ] }; // 调用并输出结果 console.log(JSON.stringify(flattenFamilyTree(myObj), null, 2));
关键说明
- 无全局变量:递归函数每次调用都会返回当前节点及所有子节点的扁平化数组,通过扩展运算符
...合并结果,全程不需要外部状态。 - grandparent字段传递:递归处理子节点时,把当前节点的
parentId作为子节点的grandparentId,完美实现祖父ID的关联。 - 灵活适配:如果你的家族树节点字段不是
children、name,只需修改代码中对应的字段名即可。 - 数组扁平化:使用
flatMap替代map,避免子节点递归返回的数组嵌套,直接得到一维结果数组。
内容的提问来源于stack exchange,提问作者user3872094
相关产品推荐
相关产品推荐

