记录下递归
在树形结构中,已知目标对象的值,可以通过递归或迭代的方式找到其所有父级对象。以下是一个基于递归的方法,通过 id
查找目标对象的所有父级对象。
主要记录下之前写代码的不好习惯----如果是想利用递归函数返回对应的数据,那么要接收每个递归函数的返回值,否则深层递归的值将获取不到
示例代码
数据结构
假设你的树形结构数据如下:
const treeData = [{id: 1,name: '父节点1',children: [{id: 11,name: '子节点1-1',children: [{ id: 111, name: '子节点1-1-1', parentId: 11 },],parentId: 1,},],},{id: 2,name: '父节点2',children: [{ id: 21, name: '子节点2-1', parentId: 2 },],},
];
方法:递归查找父级对象
以下是一个递归函数,用于查找目标对象的所有父级对象:
function findParentNodes(tree, targetId) {let result = [];// 遍历当前层级的节点for (const node of tree) {if (node.id === targetId) {// 如果找到目标节点,返回结果return result;}if (node.children && node.children.length > 0) {// 递归查找子节点const foundNodes = findParentNodes(node.children, targetId);if (foundNodes) {// 如果在子节点中找到目标节点,将当前节点添加到结果中result = [...foundNodes, node];return result;}}}// 如果当前层级未找到目标节点,返回 nullreturn null;
}// 示例:查找目标节点的所有父级
const targetId = 111; // 目标节点的 ID
const parentNodes = findParentNodes(treeData, targetId);if (parentNodes) {console.log('父级节点:', parentNodes);
} else {console.log('未找到目标节点');
}
代码说明
-
递归函数:
findParentNodes
是一个递归函数,它接受三个参数:tree
:当前层级的树形数据。targetId
:目标节点的 ID。
-
遍历当前层级:
- 遍历当前层级的节点,检查每个节点的
id
是否与目标 ID 匹配。
- 遍历当前层级的节点,检查每个节点的
-
递归查找子节点:
- 如果当前节点有子节点(
children
),递归调用findParentNodes
函数,查找子节点中的目标节点。
- 如果当前节点有子节点(
-
返回结果:
- 如果在子节点中找到目标节点,将当前节点添加到结果数组中,并返回结果。
- 如果当前层级未找到目标节点,返回
null
。
-
调用示例:
- 调用
findParentNodes
函数,传入树形数据和目标节点的 ID。 - 如果找到目标节点的父级节点,打印结果;否则,打印未找到提示。
- 调用
输出结果
假设目标节点的 ID 是 111
,输出结果如下:
父级节点: [{ id: 11, name: '子节点1-1', parentId: 1 },{ id: 1, name: '父节点1' }
]
注意事项
- 确保树形结构数据中包含
children
字段。 - 如果树形结构较深,递归调用可能会导致性能问题。在这种情况下,可以考虑使用迭代方法(如栈或队列)来实现。
- 如果目标节点不存在于树形结构中,函数会返回
null
。
通过上述方法,可以高效地找到目标节点的所有父级对象。