TransWikia.com

Agrupar um array de objetos

Stack Overflow em Português Asked by David Coelho on September 26, 2021

Estou tentando agrupar um array de objetos que vem do banco no seguinte formato:

[
       {
          '12312312': { 'first_name': 'David', 'id_question': 0, 'acertou': 1 },
          '23423423': { 'first_name': 'Luis', 'id_question': 0, 'acertou': 1 },
          '45645645': { 'first_name': 'José', 'id_question': 0, 'acertou': 1 }
       },
       {
          '12312312': { 'first_name': 'David', 'id_question': 1, 'acertou': 1 },
          '23423423': { 'first_name': 'Luis', 'id_question': 1, 'acertou': 0 },
          '45645645': { 'first_name': 'José', 'id_question': 1, 'acertou': 1 }
       },
       {
          '12312312': { 'first_name': 'David', 'id_question': 2, 'acertou': 1 },
          '23423423': { 'first_name': 'Luis', 'id_question': 2, 'acertou': 1 },
          '45645645': { 'first_name': 'José', 'id_question': 2, 'acertou': 0 }
       }
]

Estou precisando transformá-lo para o seguinte formato:

[
    {
        first_name: "David",
        resultados: [
            { "id_question": 0, "acertou": 1 },
            { "id_question": 1, "acertou": 1 },
            { "id_question": 2, "acertou": 1 }
        ]
     },
     {
         first_name: "Luis",
         resultados: [
            { "id_question": 0, "acertou": 1 },
            { "id_question": 1, "acertou": 0 },
            { "id_question": 2, "acertou": 1 }
         ]
     },
     {
          first_name: "José",
          resultados: [
            { "id_question": 0, "acertou": 1 },
            { "id_question": 1, "acertou": 1 },
            { "id_question": 2, "acertou": 0 }
          ]
     }
]

Alguém poderia me ajudar por favor?

Obrigado.

3 Answers

Opa, consegui obter seu resultado esperado utilizando apenas Javascript puro.

Segue código abaixo:

var arrBase = [
  {
    12312312: { first_name: "David", id_question: 0, acertou: 1 },
    23423423: { first_name: "Luis", id_question: 0, acertou: 1 },
    45645645: { first_name: "José", id_question: 0, acertou: 1 },
  },
  {
    12312312: { first_name: "David", id_question: 1, acertou: 1 },
    23423423: { first_name: "Luis", id_question: 1, acertou: 0 },
    45645645: { first_name: "José", id_question: 1, acertou: 1 },
  },
  {
    12312312: { first_name: "David", id_question: 2, acertou: 1 },
    23423423: { first_name: "Luis", id_question: 2, acertou: 1 },
    45645645: { first_name: "José", id_question: 2, acertou: 0 },
  },
];

var arrFinal = [];

// loop através da lista base
for (let idx = 0; idx  e.first_name === elementoBase.first_name
    );

    // primeira situação: se existir o elemento devo acrescentar o resultado
    if (elementoEncontrado) {
      // encontro o index do elemento para substituí-lo posteriormente
      const idxElementoEncontrado = arrFinal.findIndex(
        (e2) => e2.first_name === elementoEncontrado.first_name
      );
      // substituo o elemento acrescentando o resultado
      arrFinal[idxElementoEncontrado] = {
        first_name: elementoBase.first_name,
        resultados: elementoEncontrado.resultados.concat({
          id_question: elementoBase.id_question,
          acertou: elementoBase.acertou,
        }),
      };
      // segunda situação: se não existir o elemento
      // devo criar um array novo com primeiro resultado
    } else {
      arrFinal.push({
        first_name: elementoBase.first_name,
        resultados: [
          {
            id_question: elementoBase.id_question,
            acertou: elementoBase.acertou,
          },
        ],
      });
    }
  }
}

console.log(JSON.stringify(arrFinal, null, "t"));

// [
//     {
//         'first_name': 'David',
//         'resultados': [
//             {
//                 'id_question': 0,
//                 'acertou': 1
//             },
//             {
//                 'id_question': 1,
//                 'acertou': 1
//             },
//             {
//                 'id_question': 2,
//                 'acertou': 1
//             }
//         ]
//     },
//     {
//         'first_name': 'Luis',
//         'resultados': [
//             {
//                 'id_question': 0,
//                 'acertou': 1
//             },
//             {
//                 'id_question': 1,
//                 'acertou': 0
//             },
//             {
//                 'id_question': 2,
//                 'acertou': 1
//             }
//         ]
//     },
//     {
//         'first_name': 'José',
//         'resultados': [
//             {
//                 'id_question': 0,
//                 'acertou': 1
//             },
//             {
//                 'id_question': 1,
//                 'acertou': 1
//             },
//             {
//                 'id_question': 2,
//                 'acertou': 0
//             }
//         ]
//     }
// ]

CodePen: https://codepen.io/maicongodinho1/pen/wvdpXpj

Qualquer dúvida só perguntar.

Answered by Maicon Godinho on September 26, 2021

Resolvi da seguinte forma utilizando o groupBy do lodash:

        let itt = []; // Recebe os valores do banco de dados             
        let arr1 = [];

         for (let i = 0; i < itt.length; i++) {
            arr1.push(Object.values(itt[i]))
         }

         let arr2 = [];

         for (let j = 0; j < arr1.length; j++) {
            for (let z = 0; z < Object.values(arr1[j]).length; z++) {
               arr2.push(arr1[j][z])
            }
         }

         let arr3 = _.groupBy(arr2, 'first_name')

         let arr = []

         Object.keys(arr3).map(function (objectKey, index) {
            let value = arr3[objectKey];
            let val1 = {
               first_name: objectKey,
               respostas: value
            }
            arr.push(val1)
         });

         this.itemsFiltered = arr; // Valores no formato que desejo enviar para o front

Funcionou pra mim.

Answered by David Coelho on September 26, 2021

Cara, acho que nem precisa criar outro array, usa o .forEach ou .indexOf e boa. Por exemplo:

var arrTemp = JSON.parse(resposta_do_banco);
arrTemp.forEach(fillResumeArr);

function fillResumeArr(item, index)
{
    //como seus subitens são arrays, verifico se o item é um array, e boa
    if(item.isarray()){
        //faz o que quiser com o item.
    }
}

Answered by Rafael Mori on September 26, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP