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

使用递归函数计算树形数组父节点total为子节点total的总和

递归计算父节点total为所有子节点total之和

给定输入数组:

const arr = [
  { id: 1 },
  { id: 11, parent_id: 1, total: 2 },
  { id: 12, parent_id: 1 },
  { id: 121, parent_id: 12, total: 1 },
  { id: 122, parent_id: 12, total: 2 }
];

要求通过递归函数实现父节点的total值等于其所有子节点total值的总和,预期输出:

[
  { id: 1 , total: 5}, 
  { id: 11, parent_id: 1, total: 2 },
  { id: 12, parent_id: 1, total: 3 }, 
  { id: 121, parent_id: 12, total: 1 },
  { id: 122, parent_id: 12, total: 2 }
];

解决方案

function calculateParentTotal(arr) {
  // 构建父节点ID到子节点列表的映射
  const parentMap = {};
  arr.forEach(node => {
    const parentId = node.parent_id;
    if (parentId) {
      parentMap[parentId] = parentMap[parentId] || [];
      parentMap[parentId].push(node);
    }
  });

  // 递归计算节点的total值
  function computeTotal(node) {
    const children = parentMap[node.id] || [];
    // 累加所有子节点的total(递归计算子节点的total)
    const childrenTotal = children.reduce((sum, child) => sum + computeTotal(child), 0);
    
    // 若当前节点无total,赋值为子节点总和;保留原有total(叶子节点)
    if (node.total === undefined) {
      node.total = childrenTotal;
    }
    
    return node.total;
  }

  // 处理所有根节点(无parent_id的节点)
  arr.forEach(node => {
    if (!node.parent_id) {
      computeTotal(node);
    }
  });

  return arr;
}

// 测试示例
const inputArr = [
  { id: 1 },
  { id: 11, parent_id: 1, total: 2 },
  { id: 12, parent_id: 1 },
  { id: 121, parent_id: 12, total: 1 },
  { id: 122, parent_id: 12, total: 2 }
];

console.log(calculateParentTotal(inputArr));

代码说明

  1. 构建父节点映射:遍历数组将节点按parent_id归类,生成父节点ID到子节点数组的映射,避免递归时重复遍历整个数组查找子节点,提升效率。
  2. 递归计算逻辑:
    • 对每个节点,先获取其所有子节点,递归调用computeTotal计算子节点的total值。
    • 累加子节点的total总和,若当前节点无total属性(非叶子节点),则将总和赋值给它的total。
    • 返回当前节点的total值,供父节点累加使用。
  3. 触发递归:遍历数组找到所有根节点(无parent_id的节点),调用递归函数,递归会自动处理所有层级的子节点,完成整个数组的total计算。

内容的提问来源于stack exchange,提问作者Vu Phan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 22:37:28