---
title: Loop - FOR
slug: loop-for
docTags: 
createdAt: 2024-07-04T18:48:40.189Z
---

## Objetivo/Resumo

O conector For oferece uma interface simplificada e padronizada para executar iterações sobre uma sequência, como uma lista. Ele permite executar um bloco de código repetidamente para cada item na sequência, sendo essencial para automatizar tarefas repetitivas, processar coleções de dados e realizar operações em massa de maneira eficiente e organizada.

## Criando um fluxo utilizando o conector For

### 1. Configurar o fluxo com For

1.1 Crie um fluxo e arraste o conector For para o canvas.

1.2 Selecione o conector For. Na aba de Parametrizações, você encontrará os campos de configuração.

::Image[]{src="https://api.archbee.com/api/optimize/G1NTw6yAi4RDUYbsU8csp/jVjfQiPlasEPeOHp6moKX_untitled-18.png" size="50" width="441" height="606" position="center" showCaption="false"}

### 2. Definir a expressão escolhida

2.1 **Range:** Define a quantidade de iterações:

- `Fixa`**:** Passando um número inteiro na parametrização.
- `Dinâmica`**:** Utilizando o tamanho da lista que você deseja percorrer, com a função `len`. Exemplo:

::Image[]{src="https://api.archbee.com/api/optimize/G1NTw6yAi4RDUYbsU8csp/_KWDcb8lPvWf6mGh-CH9p_untitled-17.png" size="50" width="441" height="606" position="center" showCaption="false"}

```text
{{ len .steps.lista.body }}
```

:::hint{type="warning"}
Para pegar a iteração atual do For nos passos que estão dentro da porta de saída `initial` é obrigatório manter o resultado do For na memória, na configuração das Propriedades.
:::

![](https://api.archbee.com/api/optimize/G1NTw6yAi4RDUYbsU8csp/IJqDhGvF8GW5b3NptVbsN_for.gif)

### 3. Configurar portas de saídas

O conector possui duas saídas: `initial` e `next`.

**Initial:**

Define o que você deseja fazer com a iteração. Aqui você pode construir o fluxo desejado utilizando os dados da iteração corrente. Por exemplo, para acessar o índice da iteração e o item correspondente na lista, você pode usar o seguinte código:

```go
{{ $i := .steps.iterar.body.index | int -}}
{{ $objeto := index .steps.lista.body $i -}}

Iteration index: {{ $i }}
Current item: {{ $objeto }}
```

- `{{ $i := .steps.for.body.index | int -}}`: Armazena o índice atual da iteração na variável `$i`.
- `{{ $objeto := index .steps.objectList.body $i -}}`: Usa o índice para acessar o item correspondente na lista `.steps.objectList.body` e armazena na variável `$objeto`.

**Next:**

É executado após todas as iterações do bloco `initial`. Você pode definir a ação a ser tomada conforme sua necessidade. Lembrando que no contexto dos passos que estão dentro do initial mesmo que salvos na memória, eles não podem ser recuperados no next.

## Exemplos práticos

### Exemplo 1: Iterar sobre lista no Template

**Passo 1: Criar uma lista de objetos**

Vamos criar uma lista de objetos que representam frutas com suas propriedades:

```go
$myObjectList := [
    {"nome": "Maçã", "cor": "Vermelha"},
    {"nome": "Banana", "cor": "Amarela"},
    {"nome": "Cereja", "cor": "Vermelha"},
    {"nome": "Damasco", "cor": "Laranja"},
    {"nome": "Uva", "cor": "Roxa"}
]
```

**Passo 2: Configurar o conector For**

No conector For, defina a expressão dinâmica para iterar sobre a lista:

```go
{{ len $myObjectList }}
```

**Passo 3: Configurar a saída Initial**

No bloco `initial`, configure para exibir o índice e as propriedades do objeto atual:

```go
{{ $i := .steps.for.body.index | int -}}
{{ $fruta := index $myObjectList $i -}}

Iteration index: {{ $i }}
Current item: Nome - {{ $fruta.nome }}, Cor - {{ $fruta.cor }}
```

**Passo 4: Configurar a Saída Next**

No bloco `next`, você pode definir uma ação para ser realizada após a conclusão de todas as iterações. Por exemplo, enviar uma mensagem indicando que a iteração foi concluída.

### Exemplo 2: Iterar sobre códigos de produtos

Vamos criar uma lista de produtos com códigos antigos e novos, e determinar o código do novo sistema para cada produto:

**Passo 1: Criar uma lista de produtos**

```go
$products := [
    {"codigo_antigo": "123", "nome": "Produto A"},
    {"codigo_antigo": "456", "nome": "Produto B"},
    {"codigo_antigo": "789", "nome": "Produto C"}
]
```

**Passo 2: Configurar o conector For**

No conector For, defina a expressão dinâmica para iterar sobre a lista:

```go
{{ len $products }}
```

**Passo 3: Configurar a Saída Initial**

No bloco `initial`, configure para mapear o código antigo para o novo:

```go
{{ $i := .steps.for.body.index | int -}}
{{ $produto := index $products $i -}}
{{ $codigo_novo := concat "NEW-" $produto.codigo_antigo -}}

Iteration index: {{ $i }}
Produto: {{ $produto.nome }}
Código novo: {{ $codigo_novo }}
```

### Exemplo 3: Paginação de retorno de dados do Banco

Vamos criar um fluxo para paginar o retorno de dados de um banco:

**Passo 1: Obter dados do Banco de dados**

Suponha que obtemos um retorno de dados do banco:

```go
$dados := [
    {"id": 1, "nome": "Alice"},
    {"id": 2, "nome": "Bob"},
    {"id": 3, "nome": "Charlie"},
    {"id": 4, "nome": "Diana"},
    {"id": 5, "nome": "Eve"}
]

```

**Passo 2: Configurar o conector For**

No conector For, defina a expressão dinâmica para iterar sobre a lista de dados:

```go
{{ len $dados }}
```

**Passo 3: Configurar a saída Initial**

No bloco `initial`, configure para processar os dados em páginas de tamanho 2:

```go
{{ $i := .steps.for.body.index | int -}}
{{ $dado := index $dados $i -}}
{{ $pagina := div $i 2 | int -}}

Iteration index: {{ $i }}
Página: {{ $pagina }}
Dado: {{ $dado.nome }}
```

## Conclusão

A utilização do conector For permite automatizar tarefas repetitivas e processar coleções de dados de maneira eficiente e organizada. Com as configurações apropriadas, você pode definir a quantidade de iterações e as ações a serem tomadas durante e após as iterações, facilitando a criação de fluxos complexos e personalizados. Utilizando o bloco `initial`, você pode acessar e manipular os dados da iteração corrente de forma dinâmica, permitindo uma grande flexibilidade na criação de seus fluxos. Com o exemplo prático apresentado, fica claro como o conector For pode ser aplicado para iterar sobre listas de objetos e executar operações específicas para cada item, tornando os processos mais automatizados e eficientes.
