如何按天,周,月分组具有时间戳属性的对象?

 易秀胜_444 发布于 2023-02-09 20:33

在nodejs应用程序中,我有一个事件对象数组,格式如下:

eventsArray = [ {id: 1, date: 1387271989749 }, {id:2, date: 1387271989760}, ... ]

eventsArray具有可变长度的n个元素,假设我选择时间参考为巴黎时间,我希望能够按天,周或月分组元素:

groupedByDay = {

            2012: { ... },
            2013: {
              dayN  : [{id: a0, date: b0}, {id: a1, date: b1}, {id: a2, date: b2 }],
              dayN+1: [{id: a3, date: b3}, {id: a4, date: b4}, {id: a5, date: b5 }],
              ...
                   },
            2014: { ... }

          }

groupedByWeek = {
            2012: { ... }
            2013: {
              weekN: [{id: a0, date: b0}, {id: a1, date: b1}, {id: a2, date: b2 }],
              weekN+1: [{id: a3, date: b3}],
              ....
                  },
             2014: { ... }
                }

groupedByMonth = {
             2012: { ... },
             2013: {
               monthN: [ {id: a0, date: b0 }, {id: a1, b1}, {id: a2, b2}, {id: a3, b3 }],
               monthN+1: [ {id: a4, date: b4 }, {id: a5, b5}, {id: a6, b6}],
               ...
                   },
              2014: { ... }
                 }

由于没有很好的操作unix时间戳的经验,我想知道如何做到这一点,或者是否有一个npm模块可以使这更容易.

2 个回答
  • 以上所有解决方案都是高质量,纯粹的JS,香草解决方案.如果你可以使用几个库,那么lodash和moment可以一起用于简单的一个衬里:

    ES6

    let groupedResults = _.groupBy(results, (result) => moment(result['Date'], 'DD/MM/YYYY').startOf('isoWeek'));
    

    年长的JS

    var groupedResults = _.groupBy(results, function (result) {
      return moment(result['Date'], 'DD/MM/YYYY').startOf('isoWeek');
    });
    

    这将导致一个在本周开始时键入的数组,例如Mon Jul 25 2016 00:00:00 GMT+0100.我相信你可以找出如何扩展它以获得数月,数年等.

    RE:@SaintScott的评论

    在评论中提到,这不直接回答问题,因为原始使用UTC时间戳而不是格式化日期.在这种情况下,您应该使用moment()没有第二个参数:

    moment(1387271989749).startOf('isoWeek');
    

    或者,如果使用UNIX时间戳,如下所示:

    moment.unix(yourTimestamp).startOf('isoWeek');
    

    ...虽然这已经开始从问题中得到更多,但更多的是Moment文档,如果您想使用此方法,我建议您阅读.

    2023-02-09 20:37 回答
  • 这是我的解决方案.请记住,日期,周和月相对于原点,因为时代:

    eventsArray = [ {id: 1, date: 1387271989749 }, {id:2, date: 1387271989760} ];
    byday={};
    byweek={};
    bymonth={};
    function groupday(value, index, array)
    {
        d = new Date(value['date']);
        d = Math.floor(d.getTime()/(1000*60*60*24));
        byday[d]=byday[d]||[];
        byday[d].push(value);
    }
    function groupweek(value, index, array)
    {
        d = new Date(value['date']);
        d = Math.floor(d.getTime()/(1000*60*60*24*7));
        byweek[d]=byweek[d]||[];
        byweek[d].push(value);
    }
    function groupmonth(value, index, array)
    {
        d = new Date(value['date']);
        d = (d.getFullYear()-1970)*12 + d.getMonth();
        bymonth[d]=bymonth[d]||[];
        bymonth[d].push(value);
    }
    eventsArray.map(groupday);
    eventsArray.map(groupweek);
    eventsArray.map(groupmonth);
    

    2023-02-09 20:37 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有