首页 > 解决方案 > 使用递归查找数组中对象值的总和

问题描述

我正在尝试使用递归来完成任务的总和。一个对象代表一个团队成员,他们可以管理其他成员。

var team = {
  name: 'Rufus',
  completedTasks: 4,
  manages: [
    {
      name: 'Clara',
      completedTasks: 6,
      manages: [
        {
          name: 'Dana',
          completedTasks: 12,
          manages: []
        }
      ]
    },
   {
      name: 'Charles',
      completedTasks: 19,
      manages: []
    }
  ]
};

这是我已经实现的,但我没有得到 41。4 + 6 + 12 + 19 = 41。函数返回 45。

var totalTasks = function (team) {
  
  var sum = 0;
  
  var innerFunction = function(obj) {

  if (obj.manages.length === 0) {
    sum += obj.completedTasks;
    return;
  }

    obj.manages.forEach(function(item) {
      sum += obj.completedTasks;
      innerFunction(item);
    });
  };

  innerFunction(team);

  return sum;
};

totalTasks(team);

标签: javascriptrecursion

解决方案


发生这种情况是因为在您的forEach循环中添加obj.completedTasks了与循环项无关的内容,因此您在每次迭代中添加了相同的数字。

无条件地将添加限制为仅添加obj.completedTasks一次(作为第一件事)。所以:

var team = {name: 'Rufus',completedTasks: 4,manages: [{name: 'Clara',completedTasks: 6,manages: [{name: 'Dana',completedTasks: 12,manages: []}]},{name: 'Charles',completedTasks: 19,manages: []}]};

var totalTasks = function (team) {
  var sum = 0;

  var innerFunction = function(obj) {
    sum += obj.completedTasks;
    if (obj.manages.length === 0) return;
    obj.manages.forEach(innerFunction);
  };

  innerFunction(team);
  return sum;
};

console.log(totalTasks(team));

如果您不sum作为非局部变量进行管理,而只是递归地累积它,那就更好了:

var team = {name: 'Rufus',completedTasks: 4,manages: [{name: 'Clara',completedTasks: 6,manages: [{name: 'Dana',completedTasks: 12,manages: []}]},{name: 'Charles',completedTasks: 19,manages: []}]};

var totalTasks = team =>
    team.completedTasks + 
    team.manages.reduce((sum, child) => sum + totalTasks(child), 0);

console.log(totalTasks(team));


推荐阅读