将日期数组按最接近的日期排序

3
我有一个包含不同日期的数组,例如: const arr = ['21. may', '01. jan', '05. feb', '07. jun', '20. dec'] 我希望将这些日期按照距离今天最近的日期排序。在这个例子中(当天是3月18日),输出应该是: const arr = ['21. may', '07. jun', '20. dec', '01. jan', '05. feb'] 即使没有年份,这是否可行呢?

1
请提供代码,你尝试了什么? - undefined
2
是的,这是有可能的。你只需要定义你想要的任何接近度量标准。你能写一个函数,输出这些日期中离今天有多接近吗? - undefined
3个回答

4
如果你想按与今天的距离对日期进行排序,那么可以这样做,过去的日期(负距离)将显示在最后:

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"]


这离正确答案太接近了。不幸的是,它输出的是最接近的二月。这不是我想要的,因为我们已经过了二月。 - undefined
最快到下一个日期 - undefined
1
@jonask,我通过在过去的日期上加一年,然后进行比较来修复了它。 - undefined
1
非常感谢你! - undefined
1
@jo_va 啊,好的。还有谢谢你的编辑,这正是我刚想建议的 :-) 甚至可以将 setFullYear() 的调用移到 toDate 中。 - undefined
显示剩余6条评论

0
如果你确定你的日期数据中没有年份,你可以尝试这样做:
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"]

如果需要的话,可以使用日期作为输入参数来进行修改,或者设置相同的年份,以便使每个日期都能正常工作,无论是哪一年。


如果之前或之后的字符串顺序不正确,这将会出错。例如,如果六月出现在五月之前。 - undefined

0
如果你在日期字符串的末尾添加字符串'2019',JavaScript的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"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接