Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

119
Visualizações
Finding the sum of values of objects within arrays using recursion

I am trying to get the sum of tasks completed using recursion. An object represents a team member and they can manage other members.

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

This is what I have implemented, but I am not getting 41. 4 + 6 + 12 + 19 = 41. The function is returning 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);

about 4 years ago · Juan Pablo Isaza
3 Respostas
Responde à pergunta

0

This happens because in your forEach loop you add obj.completedTasks which has nothing to do with the looped item, and so you are adding the same number in every iteration.

Keep the adding limited to only add obj.completedTasks once (as the first thing to do), unconditionally. So:

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

It is nicer if you don't manage sum as a non-local variable, but just accumulate it recursively:

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

about 4 years ago · Juan Pablo Isaza Relatório

0

The problem with your code is that you wrote:

sum += obj.completedTasks;

instead of

sum += item.completedTasks;

inside the foreach which means that the outer person's completed tasks is getting added instead of the inner person's.

Regardless, it seemed your function was overcomplicated and could be shortened.

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

about 4 years ago · Juan Pablo Isaza Relatório

0

The following code will solve the problem.

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

  return item.completedTasks
}

totalTasks(team);

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda