AnswerBun.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!

Related Questions

Como desabilitar o required quando o seu input não estiver visível

2  Asked on January 17, 2021 by bruno-henrique

     

Evento onchange do datepicker em HTML5

1  Asked on January 16, 2021 by rodrigo-santos

       

Programa usando malloc duas vezes

3  Asked on January 16, 2021 by gabriel-vinicius

     

Como ocultar informações sensíveis no Django?

3  Asked on January 15, 2021 by vinicius-bussola

         

Flexbox deixa as imagens redimensionadas

1  Asked on January 15, 2021 by niko

   

Posso utilizar um iPhone para testar um app Xamarin?

3  Asked on January 14, 2021 by gustavo-oliveira

         

Alterar posição do elemento com JavaScript

1  Asked on January 13, 2021 by vernica-emschermann

   

Consumir API REST de um endpoint HTTPS com Angular 10 (CORS)

0  Asked on January 13, 2021 by phelipe-chiarelli

         

API REST Consultando outra API

1  Asked on January 13, 2021 by letcia-helena

       

Cliente e Servidor socket com Indy

1  Asked on January 12, 2021 by tonico-bittencourt

     

Como passar uma struct alocada dinamicamente para uma função em C?

1  Asked on January 12, 2021 by larissa-benevides-vieira

         

Como testar exports de um package?

1  Asked on January 11, 2021 by felipe-avelar

   

Somando varios inputs com mesmo id jquery ou javaScript

1  Asked on January 9, 2021 by joao_vitor

     

Solução simples para algoritmo de Fibonacci

6  Asked on January 9, 2021 by joo-laurent

       

“min()” com dois parâmetros

1  Asked on January 8, 2021 by wesley

   

Solr, Lucene e ElasticSearch quais as diferenças? Quando usar um ou outro?

1  Asked on January 7, 2021 by guilherme-de-jesus-santos

       

Ask a Question

Get help from others!

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