Отсортировать массив дат по близости к дате
Нужно отсортировать события по дате их наступления.
Пример
Пусть сегодня 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
→ Ссылка
можно обойтись малой кровью :)
ну относительно малой - если массивы не мегабайтные
отсортировать массив
дату преобразовать к виду год-месяц-день
сортировать как строку
если что - то дату в виде год-месяц-день можно перевести в 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
→ Ссылка
Примерно так.
- Приводим к Date
- Сортируем
- Разбиваем на даты до текущего дня и после либо равно.
- Даты после или равны идут первыми, затем те что прошли. (При необходимости вторые можно отсортировать.)
- Объединяем.
- Выводим в исходном формате.
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);