使用递归查找数组中对象的值之和



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

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);

这是因为在你的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));

你的代码的问题是你写:

sum += obj.completedTasks;

不是

sum += item.completedTasks;

在foreach中,这意味着外部人员完成的任务将被添加,而不是内部人员的任务。

无论如何,你的函数似乎过于复杂,可以缩短。

function allTasks (person)
{
return person.completedTasks + person.manages.map(allTasks).reduce((a, b) => a + b, 0);
}

var team = {
name: 'Rufus',
completedTasks: 4,
manages: [
{
name: 'Clara',
completedTasks: 6,
manages: [
{
name: 'Dana',
completedTasks: 12,
manages: []
}
]
},
{
name: 'Charles',
completedTasks: 19,
manages: []
}
]
};
function allTasks (person)
{
return person.completedTasks + person.manages.map(allTasks).reduce((a, b) => a + b, 0);
}
console.log(allTasks(team));

下面的代码将解决这个问题。

function totalTasks(item){
if (item.manages.length){
return item.completedTasks + item.manages.reduce((sum,item) => sum + totalTask(item), 0 )
}
return item.completedTasks
}
totalTasks(team);

相关内容

  • 没有找到相关文章

最新更新