TypeScript:实现嵌套对象数组全层级遍历并提取指定字段
递归处理树形结构节点转换
针对你的需求,你可以通过递归函数来遍历所有层级的节点,完成结构转换。以下是两种场景的实现方案:
方案1:保留原树形层级结构
如果需要保留节点的层级关系,转换后仍为树形结构:
首先定义类型(TypeScript):
// 原始节点类型 interface OriginalTreeNode { id: number; name: string; children: OriginalTreeNode[]; } // 转换后的目标节点类型 interface TransformedTreeNode { value: number; name: string; selected: boolean; children: TransformedTreeNode[]; }
实现递归转换函数:
function transformTreeNodes(nodes: OriginalTreeNode[]): TransformedTreeNode[] { return nodes.map(node => { // 转换当前节点的结构 const transformed = { value: node.id, name: node.name, selected: false, children: [] as TransformedTreeNode[] }; // 递归处理子节点(如果存在) if (node.children.length > 0) { transformed.children = transformTreeNodes(node.children); } return transformed; }); }
调用方式:
// 处理tree的所有子节点层级 const transformedTree = transformTreeNodes(tree.children);
方案2:平铺所有节点为一维数组
如果不需要保留层级,只需要把所有节点提取到一个一维数组中:
function flattenTransformNodes(nodes: OriginalTreeNode[]): TransformedTreeNode[] { let result: TransformedTreeNode[] = []; nodes.forEach(node => { // 添加当前节点 result.push({ value: node.id, name: node.name, selected: false }); // 递归处理子节点并合并到结果 if (node.children.length > 0) { result = result.concat(flattenTransformNodes(node.children)); } }); return result; }
调用方式:
const flattenedNodes = flattenTransformNodes(tree.children);
核心逻辑是:每次处理一个节点时,先完成当前节点的结构转换,再检查是否存在子节点,若存在则递归调用同一个函数处理子节点,实现全层级遍历。
内容的提问来源于stack exchange,提问作者ganesh
相关产品推荐
相关产品推荐

