Сортировать массив дат по ближайшей дате

Я не видел, чтобы кто-то упоминал этот метод, но document.createElementNS() полезен в этом случае.

Вы можете создавать элементы, используя ванильный Javascript, как обычные DOM-узлы с правильным пространством имен, а затем jQuery-ify их оттуда. Например:

var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'),
    circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');

var $circle = $(circle).attr({ //All your attributes });

$(svg).append($circle);

Единственная нижняя сторона заключается в том, что вам нужно создать каждый элемент SVG с правильным пространством имен отдельно или он не будет работать.

2
задан jonask 19 March 2019 в 14:16
поделиться

3 ответа

Если вы хотите упорядочить даты по расстоянию до сегодняшнего дня, когда прошедшие даты (отрицательные расстояния) появляются последними, вы можете сделать это:

const arr = ['21. may', '01. jan', '05. feb', '07. jun', '20. dec'];

const today = new Date('2019/03/18'); // use new Date() for current day

arr.sort((a, b) => toDate(a) - toDate(b));

function toDate(str) {
  const monthNames = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];
  const [day, monthName] = str.split(/\.\s*/);
  const month = monthNames.indexOf(monthName.toLowerCase());
  const date = new Date(today.getFullYear(), month, +day);
  if (date < today) date.setFullYear(date.getFullYear() + 1);
  return date;
}

console.log(arr); // ["21. may", "07. jun", "20. dec", "01. jan", "05. feb"]

0
ответ дан jo_va 19 March 2019 в 14:16
поделиться

Если вы уверены, что в данных дат нет лет, попробуйте следующее:

function sortDateStrArrayFrom(dayAndMonth, array) {
    const dateFrom = new Date(dayAndMonth);

    const datesBefore = [];
    const datesEqual = [];
    const datesAfter = [];

    array.forEach(dateStr => {
        const date = new Date(dateStr);

        if (date < dateFrom) {
            datesBefore.push(dateStr);
        }

        if (date === dateFrom) {
            datesEqual.push(dateStr);
        }

        if (date > dateFrom) {
            datesAfter.push(dateStr);
        }
    })

    return [...datesEqual, ...datesAfter, ...datesBefore];
}

const arr = ['21. may', '01. jan', '05. feb', '07. jun', '20. dec'];

sortDateStrArrayFrom('18. mar', arr); // ["21. may", "07. jun", "20. dec", "01. jan", "05. feb"]

При необходимости его можно изменить, указав дату в качестве входного параметра или установив тот же год для каждая дата работать независимо от года

0
ответ дан marsibarsi 19 March 2019 в 14:16
поделиться

Если вы добавите строку '2019' в конец ваших строк дат, конструктор JavaScript Date проанализирует ее как текущую в этом году. Когда у вас есть куча объектов Date, достаточно просто отсортировать ваши строки и использовать findIndex , чтобы получить первый, который появится в будущем:

const dates = ['21. may', '01. jan', '05. feb', '07. jun', '20. dec'];

const sorted = [...dates].sort((a, b) => new Date(a) - new Date(b));
const soonest = sorted.findIndex(date => new Date(`${date} 2019`) > new Date());

const soonestDates = [...sorted.slice(soonest), ...sorted.slice(0, soonest)];
console.log(soonestDates);  // ["21. may", "07. jun", "20. dec", "01. jan", "05. feb"]
0
ответ дан Zac Delventhal 19 March 2019 в 14:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: