Estoy tratando de obtener la suma de tareas completadas usando recursividad. Un objeto representa a un miembro del equipo y puede administrar a otros miembros.
var team = { name: 'Rufus', completedTasks: 4, manages: [ { name: 'Clara', completedTasks: 6, manages: [ { name: 'Dana', completedTasks: 12, manages: [] } ] }, { name: 'Charles', completedTasks: 19, manages: [] } ] };Esto es lo que he implementado, pero no obtengo 41. 4 + 6 + 12 + 19 = 41. La función devuelve 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);Esto sucede porque en su ciclo forEach agrega obj.completedTasks que no tiene nada que ver con el elemento en bucle, por lo que está agregando el mismo número en cada iteración.
Mantenga la adición limitada para agregar obj.completedTasks solo una vez (como lo primero que debe hacer), incondicionalmente. Asi que:
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)); Es mejor si no administra la sum como una variable no local, sino que la acumula recursivamente:
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));El problema con tu código es que escribiste:
sum += obj.completedTasks;en vez de
sum += item.completedTasks;dentro del foreach, lo que significa que las tareas completadas de la persona externa se agregan en lugar de las de la persona interna.
Independientemente, parecía que su función era demasiado complicada y podía acortarse.
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));El siguiente código resolverá el problema.
function totalTasks(item){ if (item.manages.length){ return item.completedTasks + item.manages.reduce((sum,item) => sum + totalTask(item), 0 ) } return item.completedTasks } totalTasks(team);