Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

[Dúvida] Como percorrer um array e fazer um filtro para juntar itens da mesma categoria?

Estou criando um aplicativo com Ionic 6 e SQLite para fazer uma lista de mercado e gostaria de categorizar os itens para juntar todos no mesmo card quando houver mais de um item da mesma categoria. Estou com dificuldade para realizar essa junção, quando eu adiciono os primeiros itens que estejam na mesma categoria, ele funciona, mas ao adicionar outra categoria não consigo mais juntar os itens

Meu arquivo .ts

  //  Funcao para buscar os itens cadastrados
   public searchLista() {
    this.iEditar = false;
    this.iListaMercado = [];

// Faz o GET no SQLite para bucar o que tem salvo
    this.cListaMercadoService.listaMercadoAcoes('GET', [])
      .then(($return: any) => {
        for (let wItens of $return.itens_mercado) {

          if (wItens.categoria == '') {
            wItens.categoria = 'Diversos';
          }

        // Validação para verificar se o Array que pego os itens para exibir não está vazio, para que eu possa percorrer ele
          if (this.iListaMercado.length > 0) {
            for (let i = 0; i < this.iListaMercado.length; i++) {

              if (wItens.categoria === this.iListaMercado[i].categoria) {
                this.iListaMercado[i].itens.push({
                  id: wItens.id,
                  produto: wItens.produto,
                  quantidade: wItens.quantidade,
                  unid_medida: wItens.unid_medida,
                  class: '',
                  selecionado: false
                });

              } else {
                this.iListaMercado.push({
                  categoria: wItens.categoria,
                  itens: [{
                    id: wItens.id,
                    produto: wItens.produto,
                    quantidade: wItens.quantidade,
                    unid_medida: wItens.unid_medida,
                    class: '',
                    selecionado: false
                  }]
                });
              }

              break;
            }
          } else {
            this.iListaMercado.push({
              categoria: wItens.categoria,
              itens: [{
                id: wItens.id,
                produto: wItens.produto,
                quantidade: wItens.quantidade,
                unid_medida: wItens.unid_medida,
                class: '',
                selecionado: false
              }]
            });
          }
        }
      });
  }

Interface que estou usando para tipar o iListaMercado

export interface ListaMercado {
  categoria: string,
  itens: Array<Itens>
}

// Interface para tipagem do array de itens
interface Itens {
  id?: number,
  produto: string,
  quantidade: number,
  unid_medida: string,
  class: string,
  selecionado: boolean
}

Se alguém puder me ajudar a resolver e explicar o que estou fazendo de errado, fico agradecido!

3 respostas
solução!

O problema pode estar na lógica da validação que você está utilizando. A atual implementação só permite a adição de uma nova categoria quando nenhum item da mesma categoria foi encontrado no array iListaMercado. Uma possível solução seria mudar o laço de repetição que verifica a categoria existente para continuar até o final do array, em vez de parar ao encontrar o primeiro item da categoria. Algo assim:

if (this.iListaMercado.length > 0) {
  let categoriaEncontrada = false;
  for (let i = 0; i < this.iListaMercado.length; i++) {
    if (wItens.categoria === this.iListaMercado[i].categoria) {
      this.iListaMercado[i].itens.push({
        id: wItens.id,
        produto: wItens.produto,
        quantidade: wItens.quantidade,
        unid_medida: wItens.unid_medida,
        class: '',
        selecionado: false
      });
      categoriaEncontrada = true;
      break;
    }
  }
  if (!categoriaEncontrada) {
    this.iListaMercado.push({
      categoria: wItens.categoria,
      itens: [{
        id: wItens.id,
        produto: wItens.produto,
        quantidade: wItens.quantidade,
        unid_medida: wItens.unid_medida,
        class: '',
        selecionado: false
      }]
    });
  }
} else {
  this.iListaMercado.push({
    categoria: wItens.categoria,
    itens: [{
      id: wItens.id,
      produto: wItens.produto,
      quantidade: wItens.quantidade,
      unid_medida: wItens.unid_medida,
      class: '',
      selecionado: false
    }]
  });
}

Espero que dê certo, abraços!

Funcionou!!!!

Show! Bons estudos!