How to bring the unique values of a list array according to the newest Javascript date

Asked

Viewed 41 times

-2

Good afternoon

this script only works if my Array is always sorter from oldest to newest date

How would you give

var dados = [
    
        ["09/01/2020","JOAO"],
        ["13/01/2020","PAULO"],
        ["23/01/2020","JOAO"],
        ["01/01/2020","JOAO"],
        ["01/01/2020","PAULO"],
        ["02/01/2020","JOAO"],
        ["02/01/2020","PAULO"],
        ["03/01/2020","JOAO"]
    ]

    var novo_dados = []

    ar = []
    function addArr(el,str){
        if(!el.includes(str)){
            el.push(str)
            return true
        }
    }

    for(i=dados.length-1;i>0;i--){
        nome = dados[i][1]
        if(addArr(ar,nome)){
            novo_dados.push(dados[i])
        }

    }
    console.log(novo_dados)

1 answer

1


  let dados = [
      ["09/01/2020", "JOAO"],
      ["13/01/2020", "PAULO"],
      ["23/01/2020", "JOAO"],
      ["01/01/2020", "JOAO"],
      ["01/01/2020", "PAULO"],
      ["02/01/2020", "JOAO"],
      ["02/01/2020", "PAULO"],
      ["03/01/2020", "JOAO"]
    ];

    const resultado = [];

    dados
      // Primeiro efetua o parse da Data
      .map(a => {
        const ddMMyyyy = a[0].split('/');

        return [
          new Date(ddMMyyyy[2], +ddMMyyyy[1] - 1, ddMMyyyy[0]),
          ...a
        ]
      })
      // Ordena os registros de acordo com o novo campo Date
      .sort((a, b) => {
          if (a[0] < b[0]) {
            return 1;
          } else if (a[0] > b[0]) {
            return -1;
          } else {
            return 0;
          }
      })
      // Os itens agora estão ordenadas, então podemos garantir que a lógica abaixo irá funcionar
      // Para cada item...
      .forEach(item => {
        const nome = item[2];

        // ...verifica se o nome já foi incluido no resultado
        if (!resultado.some(x => x[1] === nome)) {
          resultado.push([item[1], item[2]]);
        }
      });

    console.log(resultado);

  • The method sort waits for a numerical return (negative for less, equal to 0 for equivalent, positive for greater). You are returning a boolean.

  • It is true @user140828, but remember that there is an implicit conversion where +true === 1 and +false === 0 are true. I will make a change to consider the -1

  • 1

    You don’t need all these if and else, just do a[0] - b[0], because objects of the type Date implement the method valueOf to return a numerical value (the number of milliseconds since Unix Timestamp).

Browser other questions tagged

You are not signed in. Login or sign up in order to post.