使用递归函数计算树形数组父节点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));
代码说明
- 构建父节点映射:遍历数组将节点按
parent_id归类,生成父节点ID到子节点数组的映射,避免递归时重复遍历整个数组查找子节点,提升效率。 - 递归计算逻辑:
- 对每个节点,先获取其所有子节点,递归调用
computeTotal计算子节点的total值。 - 累加子节点的
total总和,若当前节点无total属性(非叶子节点),则将总和赋值给它的total。 - 返回当前节点的
total值,供父节点累加使用。
- 对每个节点,先获取其所有子节点,递归调用
- 触发递归:遍历数组找到所有根节点(无
parent_id的节点),调用递归函数,递归会自动处理所有层级的子节点,完成整个数组的total计算。
内容的提问来源于stack exchange,提问作者Vu Phan
相关产品推荐
相关产品推荐

