Como agrupar as informações em um Array | Ti Responde 0153

No vídeo de hoje, vamos demonstrar em como agrupar / aglutinar as informações contidas dentro de um Array.

A dúvida de hoje, nos perguntaram, como seria possível em uma função percorrer as informações de um Array e deixar elas agrupadas num segundo Array.

 

Pensando nisso, montamos um exemplo, onde vamos demonstrar em como fazer de duas formas, uma usando o laço de repetição com For e a segunda com a função aEval.

 

Segue abaixo o vídeo exemplificando:

 

E abaixo o código fonte desenvolvido:

//Bibliotecas
#Include "tlpp-core.th"

//Declaração da namespace
Namespace custom.terminal.youtube

/*/{Protheus.doc} User Function video0153
Exemplo de como agrupar as informações de um array
@type  Function
@author Atilio
@since 29/04/2024
@example
    custom.terminal.youtube.u_video0153()
/*/

User Function video0153()
    Local aArea            := FWGetArea() As Array
    Local aNormalArray     := {}          As Array
    Local aGroupArray      := {}          As Array
    Local cGroupText       := ""          As Character
    Local nFoundPosition   := 0           As Numeric
    Local nUserChoice      := 0           As Numeric
    Local nCurrentPosition := 0           As Numeric

    //Monta um Array, com um texto e uma quantidade na direita
    aAdd(aNormalArray, {"CHOCOLATE", 15})
    aAdd(aNormalArray, {"SORVETE",   30})
    aAdd(aNormalArray, {"IOGURTE",   10})
    aAdd(aNormalArray, {"CHOCOLATE", 15})
    aAdd(aNormalArray, {"IOGURTE",   10})

    //Mostra uma mensagem para ver o que o usuário prefere
    nUserChoice := Aviso("Qual forma?", "De qual forma gostaria de agrupar?", {"For", "aEval"}, 2)

    //Se o usuário clicou no For
    If nUserChoice == 1
        //Percorre o Array
        For nCurrentPosition := 1 To Len(aNormalArray)
            //Passo 1 - captura o Texto e a Quantidade
            cGroupText := aNormalArray[nCurrentPosition][1]
            nQuantity       := aNormalArray[nCurrentPosition][2]

            //Passo 2 - encontra a posição no Array agrupado
            nFoundPosition := 0
            If Len(aGroupArray) > 0
                nFoundPosition := aScan(aGroupArray, {|y| y[1] == cGroupText})
            EndIf

            //Passo 3 - atualiza o Array agrupado (caso não encontre, cria a posição, senão incrementa a Quantidade)
            If nFoundPosition == 0
                aAdd(aGroupArray, {cGroupText, nQuantity})
            Else
                aGroupArray[nFoundPosition][2] += nQuantity
            EndIf
        Next
    
    //Senão, o usuário clicou no aEVal
    Else
        aEVal(aNormalArray, {|x| ;
            cGroupText := x[1]                                                                                                , ; //Passo 1 - captura o Texto
            nQuantity := x[2]                                                                                                 , ; //Passo 2 - captura a Quantidade
            nFoundPosition := Iif(Len(aGroupArray) == 0, 0, aScan(aGroupArray, {|y| y[1] == cGroupText}))                     , ; //Passo 3 - busca a posição no array agrupado
            Iif(nFoundPosition == 0, aAdd(aGroupArray, {cGroupText, nQuantity}), aGroupArray[nFoundPosition][2] += nQuantity)   ; //Passo 4 - Se não encontrou a posição, cria um elemento no array agrupado, senão incrementa a quantidade
        })
    EndIf

    //Exibe via ShowLog o Array Agrupado
    ShowLog(VarInfo("Array", aGroupArray, , .F.))

    FWRestArea(aArea)
Return

Bom pessoal, por hoje é só.

 

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação