Отсортировать массив дат по близости к дате

Нужно отсортировать события по дате их наступления.

Пример

Пусть сегодня 10.12.2020, а изначальный массив равен:

givenArray = [ '18.12.2020', '12.12.2020', '18.12.2019', '10.12.2020', '15.12.2020']

Тогда отсортированный массив это:

sortedArray = ['10.12.2020', '12.12.2020', '15.12.2020', '18.12.2020', '18.12.2019']

Мой алгоритм не работает

let a = [ '18.12.2020', '12.12.2020', '18.12.2019', '10.12.2020', '15.12.2020'];
const b = new Date();
a.sort(val => b.getFullYear() - Number(val.slice(4, 8)));
a.sort(val => b.getMonth() - Number(val.slice(2, 4)));
a.sort(val => b.getDate() - Number(val.slice(0, 2)));
console.log(a);


Ответы (2 шт):

Автор решения: Zhihar

можно обойтись малой кровью :)

ну относительно малой - если массивы не мегабайтные

  1. отсортировать массив

  2. дату преобразовать к виду год-месяц-день

  3. сортировать как строку

если что - то дату в виде год-месяц-день можно перевести в timestamp и сортировать как числа

arr = ['18.12.2020', '12.12.2020', '18.12.2019', '10.12.2020', '15.12.2020'];

arr = arr.sort((data1, data2) => data1.split('.').reverse().join('-').localeCompare(data2.split('.').reverse().join('-')) > 0 ? 1 : -1);

console.log(arr);

Понял, что требовал автор - вот решение:

    arr = ['18.12.2020', '12.12.2020', '18.12.2019', '10.12.2020', '15.12.2020'];
    
    arr = arr.sort((data1, data2) => {
      obj1 = data1.split('.').map(str => parseInt(str))
      obj2 = data2.split('.').map(str => parseInt(str))
      
      if (obj1[1] == obj2[1])
        if (obj1[0] == obj2[0])
          return (obj2[2] - obj1[2])
        else    
          return (obj1[0] - obj2[0])
      else
        return (obj1[1] - obj2[1])
    });
    
    console.log(arr);

→ Ссылка
Автор решения: Aziz Umarov

Примерно так.

  1. Приводим к Date
  2. Сортируем
  3. Разбиваем на даты до текущего дня и после либо равно.
  4. Даты после или равны идут первыми, затем те что прошли. (При необходимости вторые можно отсортировать.)
  5. Объединяем.
  6. Выводим в исходном формате.

Number.prototype.pad = function(size) {
var s = String(this);
while (s.length < (size || 2)) {s = "0" + s;}
return s;
}


let a = ["07.12.2020", "05.12.2020", "03.12.2020", "08.12.2019", "02.12.2019", "20.12.2020"];
const today = new Date();
let s = a.map(val => new Date(val.slice(6, 10)+"-"+val.slice(3, 5)+"-"+val.slice(0, 2))).sort((a,b)=> a - b);
let result = [...s.filter(i => i >= today),...s.filter(i => i < today).reverse()].map(i=>i.getDate().pad() + "." + (i.getMonth() + 1).pad() + "." + i.getFullYear());
 

console.log(result);

→ Ссылка