You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 12:24:01