Add Objects within a Javascript Array

Asked

Viewed 150 times

0

I need to get this result here:

[ 
   { 
      alu_id: 10,
      alu_nome: 'Edson Santana dos Santos',
      notas: { 
                dis_id: 1, dis_nome: 'Português', nota: 25 
             } 
   },
   { 
      alu_id: 11,
      alu_nome: 'Larissa Manoela da Silva',
      notas: { dis_id: 3, dis_nome: 'História', nota: 28 },
             { dis_id: 1, dis_nome: 'Português', nota: 29 },
             { dis_id: 2, dis_nome: 'Matemática', nota: 25 }
]

But this result is coming out:

[ 
   { 
      alu_id: 10,
      alu_nome: 'Edson Santana dos Santos',
      notas: { dis_id: 1, dis_nome: 'Português', nota: 25 } 
   },
   { 
      alu_id: 11,
      alu_nome: 'Larissa Manoela da Silva',
      notas: { dis_id: 2, dis_nome: 'Matemática', nota: 25 } 
   },
   { 
      alu_id: 11,
      alu_nome: 'Larissa Manoela da Silva',
      notas: { dis_id: 3, dis_nome: 'História', nota: 28 } 
   },
   { 
      alu_id: 11,
      alu_nome: 'Larissa Manoela da Silva',
      notas: { dis_id: 1, dis_nome: 'Português', nota: 29 } 
   } 
]

SOURCE CODE:

const data = {                        
                disciplinas: [],
                alunos: []                        
             }                   

for (let i = 0; i < results.length; i++) { 
   data.disciplinas.push({
      dis_id: results[i].dis_id,
      dis_nome: results[i].dis_nome
   })                        
   data.alunos.push({
      alu_id: results[i].alu_id,
      alu_nome: results[i].alu_nome,
      notas: {
                dis_id: results[i].dis_id,
                dis_nome: results[i].dis_nome,
                nota: results[i].notas_valor
             }                            
   })                                               
} 

BANK DATA: inserir a descrição da imagem aqui

2 answers

0


Have a variable to control if you are doing another data.alunos.push() for the same student. Declare this variable before of for. Example:

var alu_id_anterior = null

Once you’ve processed the student data, take the test instead:

if (results[i].alu_id === alu_id_anterior) {
    // outra nota para o mesmo aluno
} else {
    // primeira vez que trata o aluno
}

When I fall on the block of if do the push note only:

data.alunos[data.alunos.length - 1].notas.push({
    dis_id: results[i].dis_id,
    dis_nome: results[i].dis_nome,
    nota: results[i].notas_valor
})

When I fall on the block of else, do the push of the student along with the grade, as you were already doing.

As the last instruction of for, keep the student id you just processed.

alu_id_anterior = results[i].alu_id

For all this to work, it’s fundamental that the result of your query to the table is ordered by alu_id.

0

You’re using data.alunos.push to insert new data into the array, when you should use .push in the specific student. For this notas has to be an array and you have to find the student you want to insert the notes into.

You can do it like this:

const results = [{
    alu_id: 10,
    alu_nome: 'Edson Santana dos Santos',
    notas: {
      dis_id: 1,
      dis_nome: 'Português',
      nota: 25
    }
  },
  {
    alu_id: 11,
    alu_nome: 'Larissa Manoela da Silva',
    notas: {
      dis_id: 2,
      dis_nome: 'Matemática',
      nota: 25
    }
  },
  {
    alu_id: 11,
    alu_nome: 'Larissa Manoela da Silva',
    notas: {
      dis_id: 3,
      dis_nome: 'História',
      nota: 28
    }
  },
  {
    alu_id: 11,
    alu_nome: 'Larissa Manoela da Silva',
    notas: {
      dis_id: 1,
      dis_nome: 'Português',
      nota: 29
    }
  }
];

function organizarNotas() {
  const data = results.reduce((alunos, entrada) => {
  const id = entrada.alu_id;
    const aluno = alunos[id];
    if (!alunos[id]) {
      alunos[id] = {
        ...entrada,
        notas: []
      }
    }
    
    alunos[id].notas.push(entrada.notas);
    return alunos;
  }, {});
  return Object.values(data);
}

console.log('Notas:', organizarNotas(results));

Browser other questions tagged

You are not signed in. Login or sign up in order to post.