【问题标题】:How to group date object by hour/6 hours /day/week/month/year in javascript如何在javascript中按小时/6小时/天/周/月/年对日期对象进行分组
【发布时间】:2019-07-01 12:12:08
【问题描述】:

我有 10 年的记录。因此 API 将返回我需要根据日期时间戳对数组进行分组的数组。用户可以选择分组选项为

  • 小时
  • 6 小时(每天)

数据示例

[{
  "x": "2019-02-05T14:28:45.540Z",
  "y": 0.18809978382007495
}, {
  "x": "2019-02-05T14:28:45.540Z",
  "y": 0.42347719862654404
}, {
  "x": "2019-02-05T14:28:45.540Z",
  "y": 0.365386421616013
}, {
  "x": "2019-02-05T14:28:45.540Z",
  "y": 0.49364744650351033
}, {
  "x": "2019-02-05T14:28:45.540Z",
  "y": 0.31133576985952016
}, {
  "x": "2019-02-05T14:28:45.540Z",
  "y": 0.5509062071104307
}, {
  "x": "2019-02-05T14:28:45.540Z",
  "y": 0.5556739085429424
}, {
  "x": "2019-02-05T14:28:45.540Z",
  "y": 0.6668348570127745
}, {
  "x": "2019-02-05T14:28:45.540Z",
  "y": 0.4908101365372941
}, {
  "x": "2019-02-05T14:28:45.540Z",
  "y": 0.6042127351503115
}, {
  "x": "2019-02-05T14:28:45.540Z",
  "y": 0.3725497529313371
}, {
  "x": "2019-02-05T14:28:45.540Z",
  "y": 0.29687095332790064
}, {
  "x": "2018-02-07T11:19:19.034Z",
  "y": 0
}]

是否有任何通用的解决方案可以按小时/天/周/月/年进行分组

示例输出我想要的。

一小时

{
 "OCT 2th 2012 6AM": [
    "2012-10-02 06:00:00",
    "2012-10-10 06:03:51"
  ],
  "NOV 11th 2012 AM": [
    "2012-11-11 09:07:21",
    "2012-11-10 09:03:51"
  ],
  "OCT 6th 2013 2PM": [
    "2013-10-07 02:07:02"
  ],
}

每 6 小时

{
 "OCT 6th 2012 first 6 hours": [
    "2012-10-11 06:00:00",
  ],
 "OCT 6th 2012 second 6 hours": [
    "2012-10-10 06:03:51"
  ],
  "NOV 6th 2012 AM": [
    "2012-11-11 09:07:21",
    "2012-111-10 09:03:51"
  ],
  "OCT 6th 2013 2PM": [
    "2013-10-07 02:07:02"
  ],
}

一天

{
 "OCT 2th 2012": [
    "2012-10-2 06:00:00",
  ],
 "OCT 10th  2012": [
    "2012-10-10 06:03:51"
  ],
  "NOV 11th 2012": [
    "2012-11-11 09:07:21",
    "2012-11-10 09:03:51"
  ],
  "OCT 7th 2013": [
    "2013-10-07 02:07:02"
  ],
}

.for 一周

{
 "OCT 2012 week number": [
    "2012-10-2 06:00:00",
  ],
 "OCT 2012 week number": [
    "2012-10-10 06:03:51"
  ],

}

一个月

{
 "OCT 2012 ": [
    "2012-10-2 06:00:00",
  ],
 "NOV 2012": [
    "2012-11-10 06:03:51"
  ],

}

【问题讨论】:

  • 如果可能的话,您能否提供您所期望的示例输出。
  • 您想像嵌套分组一样将小时按天、按周按天、按月按年分组吗?所以像{2009:{Jan:{2:21:{8:[{item}]}}}}
  • 如果您不需要嵌套组,那么 lodash groupBy 将函数作为第二个参数:_.groupBy(data,item=>new Date(item.x).getFullYear()) 将按年份分组。您可以通过以下方式使其动态化:const currentGroup='year';const groups = {year:item=>new Date(item.x).getFullYear()};_.groupBy(data,groups[currentGroup])
  • @HMR。我已经更新了我的问题,请检查
  • 你需要知道什么,如何编写从日期返回正确键的函数或如何编写通用组方法?

标签: javascript arrays grouping


【解决方案1】:

也许你可以通过以下方式做到这一点?

const data = [{"x":"2019-02-05T14:28:45.540Z","y":0.18809978382007495},{"x":"2019-02-05T14:28:45.540Z","y":0.42347719862654404},{"x":"2019-02-05T14:28:45.540Z","y":0.365386421616013},{"x":"2019-02-05T14:28:45.540Z","y":0.49364744650351033},{"x":"2019-02-05T14:28:45.540Z","y":0.31133576985952016},{"x":"2019-02-05T14:28:45.540Z","y":0.5509062071104307},{"x":"2019-02-05T14:28:45.540Z","y":0.5556739085429424},{"x":"2019-02-05T14:28:45.540Z","y":0.6668348570127745},{"x":"2019-02-05T14:28:45.540Z","y":0.4908101365372941},{"x":"2019-02-05T14:28:45.540Z","y":0.6042127351503115},{"x":"2019-02-05T14:28:45.540Z","y":0.3725497529313371},{"x":"2019-02-05T14:28:45.540Z","y":0.29687095332790064},{"x":"2018-02-07T11:19:19.034Z","y":0}];

const groups = (() => {
    const byDay = (item) => moment(item.x).format('MMM DD YYYY'),
        forHour = (item) => byDay(item) + ' ' + moment(item.x).format('hh a'),
        by6Hour = (item) => {
            const m = moment(item.x);
            return byDay(item) + ' ' + ['first', 'second', 'third', 'fourth'][Number(m.format('k')) % 6] + ' 6 hours';
        },
        forMonth = (item) => moment(item.x).format('MMM YYYY'),
        forWeek = (item) => forMonth(item) + ' ' + moment(item.x).format('ww');
    return {
        byDay,
        forHour,
        by6Hour,
        forMonth,
        forWeek,
    };
})();

const currentGroup = 'forWeek';
console.log(_.groupBy(data, groups[currentGroup]));
<script src="https://lodash.com/vendor/cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>
<script src="https://momentjs.com/static/js/global.js"></script>

【讨论】:

    猜你喜欢
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 2023-03-13
    • 2017-01-25
    • 2019-02-20
    • 2014-01-05
    相关资源
    最近更新 更多