按时间分组消息的算法

我需要按以下顺序对消息进行排序: TodayYesterdayThis Week收到

This Week规则:从最近的星期一开始 - 不包括TodayYesterday

含义:

如果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

    上一篇: Algorithm to group messages by time

    下一篇: Best way to 'remap' a simple binary mask?