使用递归计算嵌套对象数组中所有团队成员完成任务的总和
问题分析与修复方案
错误原因
代码结果多出4的核心问题是成员任务数累加时机错误:
- 你把当前成员的
completedTasks累加操作放在了遍历下属的循环内,这就导致该成员有多少个下属,自己的任务数就会被重复累加多少次。
我们可以直接复现代码计算过程验证:
- 根成员Rufus有2个下属,遍历2次下属的过程中,他的4个任务被加了2次,多算4个
- Clara有1个下属,遍历1次下属的过程中加了1次自己的6,结果正确
- Dana、Charles没有下属,直接加自己的任务数,结果正确
- 最终总和:(4*2) + 6 + 12 + 19 = 8+6+12+19=45,和运行结果一致
修正方案
调整累加逻辑:不管当前成员有没有下属,先累加自身的任务数,再递归遍历所有下属即可,不需要拆分有无下属的分支逻辑。
修正后的代码如下:
var totalTasks = function (team) { var sum = 0; var innerFunction = function(obj) { // 先累加当前成员的任务数 sum += obj.completedTasks; // 递归遍历所有下属 obj.manages.forEach(function(item) { innerFunction(item); }); }; innerFunction(team); return sum; }; totalTasks(team); // 输出41,符合预期
也可以改成无外部变量的纯递归写法,更简洁:
var totalTasks = function (obj) { return obj.completedTasks + obj.manages.reduce((sum, item) => sum + totalTasks(item), 0); };
内容的提问来源于stack exchange,提问作者codedededed
相关产品推荐
相关产品推荐

