Angular调用Rest Api计算剩余列:如何递归累加多层嵌套数组time值
实现方案
完全可以通过递归或者循环遍历的方式完成无限层级的time字段累加,以下是Angular(TypeScript)环境下的可用代码:
递归实现(写法简洁,推荐层级不超过1000层的场景使用)
// 定义节点类型,非TS环境可删除 interface CategoryNode { first: string; time?: number; subcategory?: CategoryNode[]; totalTime?: number; } // 递归计算单个节点下所有嵌套节点的time总和 function calcTotalTime(node: CategoryNode): number { // 若不需要统计当前节点自身的time,只统计子节点总和,将初始值改为0即可 let total = node.time ?? 0; if (node.subcategory?.length) { node.subcategory.forEach(sub => total += calcTotalTime(sub)); } return total; }
使用示例:
// 接口返回的原始数组 const originArr: CategoryNode[] = [{ first:"main", subcategory : [{ first: "sub", time:3, subcategory:[{first: "sub2",time:4}] }] }]; // 给每个根节点添加总时长字段 originArr.forEach(root => { root.totalTime = calcTotalTime(root); }); // 此时originArr[0].totalTime的值为7,符合预期
循环实现(无栈溢出风险,支持极深嵌套层级)
用广度优先遍历的循环写法替代递归:
function calcTotalTimeByLoop(node: CategoryNode): number { let total = node.time ?? 0; const taskQueue = [...(node.subcategory ?? [])]; while(taskQueue.length) { const current = taskQueue.shift()!; total += current.time ?? 0; if (current.subcategory?.length) taskQueue.push(...current.subcategory); } return total; }
内容的提问来源于stack exchange,提问作者SaschaK
相关产品推荐
相关产品推荐

