如何用JavaScript高阶函数提取JSON对象中N级父子节点
提取树形JSON的N级父子节点路径:推荐用
reduce高阶函数 嘿,针对你这个需求,Array.prototype.reduce 是最适合的高阶函数——它可以递归遍历树形结构,同时累积每一条完整的父子节点路径,完美匹配你想要的空格分隔输出格式。
先明确你的需求
你需要把给定的树形JSON数组(包含父子嵌套节点),提取所有层级的节点路径,每条路径的节点名称用空格分隔输出,对应你提供的JSON,期望输出是:
Matae1 Matae2 Matae3 Child1
你的原始JSON数据
[ { "children": [], "id": 35, "map_data": {"தாலூகா": "மானாமதுரை"}, "name": "Matae1" }, { "children": [], "id": 36, "map_data": {"தாலூகா": "மானாமதுரை"}, "name": "Matae2" }, { "children": [ { "children": [], "id": 39, "map_data": {"தாலூகா": "மானாமதுரை"}, "name": "Child1" } ], "id": 36, "map_data": {"தாலூகா": "மானாமதுரை"}, "name": "Matae3" } ]
基于reduce的实现代码
我们可以写一个递归的reduce调用,来收集所有节点路径:
function extractAllPaths(nodes, parentPath = '') { return nodes.reduce((accumulatedPaths, currentNode) => { // 拼接当前节点的完整路径 const currentFullPath = parentPath ? `${parentPath} ${currentNode.name}` : currentNode.name; // 把当前路径加入结果数组 accumulatedPaths.push(currentFullPath); // 如果当前节点有子节点,递归处理子节点并合并结果 if (currentNode.children.length > 0) { accumulatedPaths.push(...extractAllPaths(currentNode.children, currentFullPath)); } return accumulatedPaths; }, []); } // 调用示例 const yourJsonData = [/* 这里放入你的原始JSON数组 */]; const paths = extractAllPaths(yourJsonData); // 输出成你要的每行一条路径的格式 console.log(paths.join('\n'));
为什么选reduce?
- 高阶函数的核心优势:
reduce本身就是专为累积处理数组元素设计的高阶函数,它接收回调函数和初始值,天然适合处理这种需要递归遍历树形结构、收集路径的场景。 - 适配任意层级:不管你的节点嵌套多少层(N级),递归的
reduce都会遍历到所有子节点,自动收集每一条完整的父子路径。 - 代码简洁易维护:把路径拼接、递归处理子节点的逻辑整合在一个
reduce回调里,代码紧凑且可读性强,后续要扩展功能(比如过滤特定节点)也很方便。
最终输出结果
运行上面的代码后,会得到完全符合你要求的格式:
Matae1 Matae2 Matae3 Child1
内容的提问来源于stack exchange,提问作者Nidhin Kumar
相关产品推荐
相关产品推荐

