Sorting by date how long they are of type string

2

I'm developing an angularJS application which receives the following object from an API:

pessoas = [
    { nome: 'Lucas', data: '2010-Fev-04'},
    { nome: 'Felipe', data: '1994-Dec-10'},
    { nome: 'Ana', data: '1994-Jun-21'},
    { nome: 'Carlos', data: '1991-Fev-20'}
];

I need to sort the column by date, but it comes in the form of an API string. I can not see a way to sort the dates correctly since I can not change the contents of that object and make the date a timestamp.

    
asked by anonymous 13.07.2018 / 21:21

2 answers

1

I made a form without using additional features. It will generate a new array called ordenados with the objects sorted by date using .sort() . The logic is to convert dates to valid date object. With this you can make a direct comparison, checking if one is larger than the other (see explanations in the code):

function fData(i){
   
   // objeto para converter nomes em números dos meses
   var mes = {
      Jan: 0, Fev: 1, Mar: 2, Abr: 3, Mai: 4, Jun: 5,
      Jul: 6, Ago: 7, Set: 8, Out: 9, Nov: 10, Dez: 11
   }
   
   // converto a data recebida em array
   i = i.data.split("-");
   
   // converto os valores em objeto data
   var d = new Date(i[0],mes[i[1]],i[2]);
   
   // retorna o objeto
   return d;
   
}

pessoas = [
    { nome: 'Lucas', data: '2010-Fev-04'},
    { nome: 'Felipe', data: '1994-Dez-10'},
    { nome: 'Carlos', data: '1991-Fev-20'},
    { nome: 'Jose', data: '1994-Jun-21'},
    { nome: 'Maria', data: '1991-Fev-19'},
    { nome: 'João', data: '1984-Mar-01'}
];

var ordenados = pessoas.sort(function(a,b){

   // retorna os valores da função fData()
   // em formato de objeto de data
   a = fData(a);
   b = fData(b);
   
   // retorna primeiro o que for menor
   // caso queria inverter, basta trocar ">" por "<"
   return a > b;

});

console.log(ordenados);
    
13.07.2018 / 23:35
5

With recourse to momentjs to make dates parsing. link

Dates should have the same language, in the example in question Feb, Dec || Feb, Dec in your case are mixed.

pessoas = [{
        nome: 'Lucas',
        data: '2010-Fev-04'
    },
    {
        nome: 'Felipe',
        data: '1994-Dez-10'
    },
    {
        nome: 'Ana',
        data: '1994-Jun-21'
    },
    {
        nome: 'Carlos',
        data: '1991-Fev-20'
    }
];


moment.locale('pt')

function comparar_datas(a, b) {
    d1 = moment(a.data, "YYYY-MMM-DD");
    d2 = moment(b.data, "YYYY-MMM-DD");
    if (d1.isAfter(d2)) {
        return 1;
    } else if (d1.isBefore(d2)) {
        return -1;
    }
    return 0;
}

pessoas.sort(comparar_datas);
console.log(pessoas)
<script src="https://momentjs.com/downloads/moment-with-locales.min.js"></script>
    
13.07.2018 / 22:20