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

Ordenação de dados carregados do storage

Boa noite.

Tenho uma dúvida, sobre a ordenação de dados do storage.

Criei uma API que retorna alguns dados (id, dados em geral, data e etc), quando eu carrego os dados eles vem ordenados corretamente pela data e faço a inserção dos mesmos no storage.

Ao recuperar esses dados para listá-los na view:

return this._storage.forEach((value, key, index) => {
            if (key.indexOf('fatura') >= 0) {
                let fatura = new Fatura(
                    value.ordem,
                    value.idestab,
                    value.documento,
                    value.parcela,
                    value.serie,
                    value.valor,
                    value.vencimento,
                    value.desconto);

                    console.log(fatura);

                faturas.push(fatura);
            }
        })
        .then(() => faturas);

Os registros não vem na ordem, que foram inseridos.

Minha dúvida são duas na verdade:

1 - Como ele trata a ordenação? É pela key que eu defini no momento da gravação?

private _getKey(fatura: Fatura) {
        return "fatura" + fatura.idestab + fatura.documento + fatura.parcela + fatura.serie;
    }

2 - Após uma série de tentativas decidi criar um campo ordem e estou enviando o índice dos registros que gravo junto com o que veio da API, mesmo assim a ordenação funciona baseada em String, ou seja: 1, 10, 11, 12..., 19, 2, 20, 21... Como eu poderia ordenar e como funciona isso?

Eu li esta documentação do Angular: https://angular.io/guide/pipes Mas eles mesmos não recomendam utilização de Pipes.

Obrigado desde já.

3 respostas
solução!

Por que você não simplesmente fez um Array.sort nos dados recebidos usando um conhecimento básico de Array que resolve elegantemente o problema? Não entendo por que você não seguiu esse caminho. Ainda mais que o sort faz parte do arsenal de todo desenvolvedor JavaScript.

Segue a documentação para relembrar seu uso:

https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

Sucesso e bom estudo.

Boa noite Flavio.

Obrigado pela resposta.

Na verdade criei o tópico também para tirar as dúvidas com relação a ordenação proveniente do storage, pois realmente é uma dúvida que eu tenho.

Com relação ao sort, eu testei com o sort logo de cara, como ele já ordenou errado, pois utilizei apenas o .sort(), pesquisei por "ionic 2 sort list" e os 3 primeiros links me direcionavam para pipes.

Incluindo um dos links onde um membro do Ionic Team (https://forum.ionicframework.com/t/order-a-list/55389) indicava o uso do mesmo, isso acabou me induzindo por este caminho.

Por fim, antes de sua resposta acabei resolvendo com o pipe mesmo:

@Pipe({name: 'orderBy'})
export class OrderByPipe implements PipeTransform {
  transform(value: Array<any>, field: string): any {
    if(value == null) {
      return null;
    }
    if (field.startsWith("-")) {
      field = field.substring(1);
      if (typeof value[field] === 'string' || value[field] instanceof String) {
        return [...value].sort((a, b) => b[field].localeCompare(a[field]));
      }
      return [...value].sort((a, b) => b[field] - a[field]);
    }
    else {
      if (typeof value[field] === 'string' || value[field] instanceof String) {
        return [...value].sort((a, b) => -b[field].localeCompare(a[field]));
      }
      return [...value].sort((a, b) => a[field] - b[field]);
    }
  }
}

Quando fui criar este tópico a primeira vez, acabei criando na parte de "Multiplataforma" e o outro instrutor Sérgio Lopes acabou tirando a dúvida com relação a ordenação do storage e disse que escreveu sobre o sort no blog do Alura (http://blog.alura.com.br/ordenacao-de-numeros-no-javascript-nao-funciona/)

Mas sim, vou fazer o teste com o .sort() para deixar mais simples.

Obrigado novamente.

Opa! Beleza! O sort é mais simples. Se usou o pipe foi bom que engrandeceu o conhecimento.