我正在尝试使用递归完成任务的总和。对象代表一个团队成员,他们可以管理其他成员。
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);