如何实现层级不固定的树形结构中子节点values值向父节点累加?
树形结构子节点值向父节点累加的实现方案
针对层级不固定的树形结构,要实现子节点的所有values值累加到其所有父节点的对应values中,**后序遍历(深度优先递归)**是最可行的方案——先处理所有子节点,再将子节点的统计值向上合并到父节点,完美适配任意层级的树形结构。
实现代码(JavaScript)
function accumulateChildValues(node) { // 先递归处理所有子节点 node.children.forEach(child => accumulateChildValues(child)); // 计算当前节点所有子节点的values总和(按name分组) const childTotal = {}; node.children.forEach(child => { child.values.forEach(item => { if (!childTotal[item.name]) { childTotal[item.name] = 0; } childTotal[item.name] += item.value; }); }); // 将子节点总和累加到当前节点的对应values中 node.values.forEach(item => { if (childTotal[item.name]) { item.value += childTotal[item.name]; } }); return node; } // 处理树形数组(示例输入) const tree = [ { "level_key":"lvl1", "level_value":"Code1", "values":[{"name":"a","value":0},{"name":"b","value":0}], "children":[ { "level_key":"lvl2", "level_value":"Type1", "values":[{"name":"a","value":0},{"name":"b","value":0}], "children":[ { "level_key":"lvl3", "level_value":"Desc1", "values":[{"name":"a","value":0},{"name":"b","value":0}], "children":[ {"level_key":"lvl4","level_value":"Check1","values":[{"name":"a","value":2},{"name":"b","value":3}],"children":[]}, {"level_key":"lvl4","level_value":"Check2","values":[{"name":"a","value":4},{"name":"b","value":5}],"children":[]} ] } ] } ] } ]; // 执行处理 tree.forEach(node => accumulateChildValues(node)); // 输出结果 console.log(JSON.stringify(tree, null, 2));
代码逻辑说明
- 递归遍历子节点:先对当前节点的所有子节点执行递归处理,确保最底层的叶子节点先完成计算,再向上传递结果。
- 统计子节点总和:遍历当前节点的所有子节点,按
values中的name分组,累加对应value的总和。 - 累加至当前节点:将子节点的分组总和,加到当前节点对应
name的value上。 - 适配任意层级:无论树形结构有多少层,递归都会自动遍历到所有叶子节点,无需固定层级。
验证结果
执行上述代码后,输出结构与期望结果完全一致:
- lvl4节点保持原始值不变
- lvl3节点的
a=2+4=6,b=3+5=8 - lvl2、lvl1节点的
values也会依次累加得到相同的结果
内容的提问来源于stack exchange,提问作者Kapil Balwani
相关产品推荐
相关产品推荐

