按时间分组消息的算法
我需要按以下顺序对消息进行排序: Today
, Yesterday
和This Week
收到
This Week
规则:从最近的星期一开始 - 不包括Today
或Yesterday
含义:
如果Today
是星期日, Yesterday
是星期六, This Week
是星期五,星期四,星期三,星期二和星期一
如果Today
是星期四, Yesterday
是星期三, This Week
是星期二和星期一
但如果Today
是星期二, Yesterday
是星期一 - This Week
没有日子
如果Today
是星期一, Yesterday
是星期天 - This Week
没有日子
我一直在努力研究如何解决This Week
。 我不断收到错误,还有很多边缘案例需要考虑。
这是我的尝试:
var currentDate = new Date()
var currentMonth = currentDate.getMonth()+1
var currentYear = currentDate.getFullYear()
var currentDayofMonth = currentDate.getDate()
var currentDayofWeek = currentDate.getDay()
messages.forEach((message, index) => {
var date = message.date.substring(0, 10).replace(/-/g, '/')
var messageDate = new Date(date)
var messageMonth = messageDate.getMonth()+1;
var messageYear = messageDate.getFullYear();
var messageDayOfMonth = messageDate.getDate();
var messageDayOfWeek = messageDate.getDay();
//TODAY
if(currentDayofMonth == messageDayOfMonth && currentMonth == messageMonth && currentYear == messageYear) {
messageTypeList["Today"].push(message)
return
}
//YESTERDAY
if(currentDayofMonth == messageDayOfMonth+1 && currentMonth == messageMonth && currentYear == messageYear) {
messageTypeList["Yesterday"].push(message)
return
}
//THIS WEEK
if(currentDayofWeek != 1 && currentDayofWeek != 2 && currentMonth == messageMonth && currentYear == messageYear) {
messageTypeList["This Week"].push(message)
return
}
})
有任何想法吗?
注意
我相信在Yesterday
我有一个边缘案例错误 - 例如,如果Today
是5月1日,它不会将4月30日计为Yesterday
因为这个月不同
通过准备一些与今天的日期相关的日期,你可以更好地准备地面:
然后将消息日期与这三个日期中的每一个进行比较:消息日期的第一个日期决定消息的类别。 如果所有三个都大于消息日期,则不需要发生任何事情。
这里是建议的代码:
// This sample uses a fixed date so the categories can be illustrated better:
var currentDate = new Date('2017/04/27') // Or leave out the argument for actual date
currentDate.setHours(0,0,0,0); // set to midnight
// Prepare all related dates: yesterday and last Monday
var keys = [];
keys.push(['Today', new Date(currentDate)]); // clone
currentDate.setDate(currentDate.getDate() - 1);
keys.push(['Yesterday', new Date(currentDate)]); // clone
currentDate.setDate(currentDate.getDate() - (currentDate.getDay()+6)%7);
keys.push(['This week', new Date(currentDate)]); // clone
var messages = [
{ date: '2017-04-21' },
{ date: '2017-04-22' },
{ date: '2017-04-23' },
{ date: '2017-04-24' }, // Monday
{ date: '2017-04-25' },
{ date: '2017-04-26' },
{ date: '2017-04-27' },
];
var messageTypeList = {
Today: [],
Yesterday: [],
"This week": []
};
messages.forEach( message => {
var date = message.date.substring(0, 10).replace(/-/g, '/');
var messageDate = new Date(date);
var [key] = keys.find( ([key, date]) => messageDate >= date ) || [];
if (key) messageTypeList[key].push(message);
});
console.log(messageTypeList);
.as-console-wrapper { max-height: 100% !important; top: 0; }
第一:将你的代码分离到函数中。 测试和调试将变得更加容易。 第二,添加'else',并在thisWeek()计算最后一个星期一(作为日期),并检查当前日期是否大于此日期(如果日期是在最后一个星期一之后) - example messageDate.getTime()> = lastMondayDate.getTime()
唯一要做的就是计算上个星期一
伪:
if (isToday(message, currentDate)){
messageTypeList["Today"].push(message)
} else if (isYesterday(message, currentDate)){
messageTypeList["Yesterday"].push(message)
} else if (isThisWeek(message, currentDate)) {
messageTypeList["This Week"].push(message)
}
链接地址: http://www.djcxy.com/p/54891.html