首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Group by timestamps with Moment js和Lodash

Group by timestamps with Moment js和Lodash
EN

Stack Overflow用户
提问于 2020-09-03 21:45:24
回答 2查看 358关注 0票数 0

我有一个这样的数据集:

代码语言:javascript
复制
2020-09-02 02:22:14
2020-09-05 10:22:14
2020-09-03 06:22:14
2020-09-07 04:22:14
2020-09-02 11:22:14
2020-09-09 03:22:14
2020-09-03 10:22:14
2020-09-04 06:22:14
2020-09-02 07:22:14
2020-09-02 06:22:14
2020-09-02 10:22:14

我想做的是每隔两个小时将时间戳分组在一起,例如:

代码语言:javascript
复制
[
02:00:00: ['2020-09-02 02:22:14', '2020-09-04 02:22:14'],
04:00:00: ['2020-09-07 04:22:14'],
06:00:00: ['2020-09-03 06:22:14', '2020-09-02 06:22:14'],
08:00:00: [] -- Empty array when no timestamp falls in that given range
10:00:00: [etc..] --up until 00:00:00
]

我尝试过的:

代码语言:javascript
复制
    const hello = _.groupBy(something, (date) => {
      const timeStamp = moment(date).add(30, 'minutes').startOf('hour').format('HH:mm:ss');
      return moment('1960-02-02 ' + timeStamp).format('YYYY-MM-DD HH:mm:ss');
    });

这将返回以下内容:

代码语言:javascript
复制
2020-09-12 02:00:00: (2) ["2020-09-02 02:22:14", "2020-09-02 02:22:14"]
2020-09-12 03:00:00: ["2020-09-09 03:22:14"]
2020-09-12 04:00:00: ["2020-09-07 04:22:14"]
2020-09-12 06:00:00: (3) ["2020-09-03 06:22:14", "2020-09-04 06:22:14", "2020-09-02 06:22:14"]
2020-09-12 07:00:00: ["2020-09-02 07:22:14"]
2020-09-12 10:00:00: (3) ["2020-09-05 10:22:14", "2020-09-03 10:22:14", "2020-09-02 10:22:14"]
2020-09-12 11:00:00: ["2020-09-02 11:22:14"]

这并不完全是我想要的,我试着通过一些其他的帖子来获得一个想法,但任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-03 22:13:23

您可以初始化包含两个小时范围的数组,并将数据分组到该范围中

代码语言:javascript
复制
const data = [
  "2020-09-02 02:22:14",
  "2020-09-05 10:22:14",
  "2020-09-03 06:22:14",
  "2020-09-07 04:22:14",
  "2020-09-02 11:22:14",
  "2020-09-09 03:22:14",
  "2020-09-03 10:22:14",
  "2020-09-04 06:22:14",
  "2020-09-02 07:22:14",
  "2020-09-02 06:22:14",
  "2020-09-02 10:22:14",
]

const byTwoHours = Array(12)
  .fill(0)
  .map((_, index) => `${String(index * 2).padStart(2, "0")}:00:00`)

const byTwoHoursLookup = byTwoHours.reduce(
  (acc, range) => ({ ...acc, [range]: [] }),
  {}
)

data.forEach((date) => {
  const hour = moment(date, "YYYY-MM-DD HH:mm:ss").format("HH:00:00")
  for (let i = byTwoHours.length - 1; i >= 0; i--) {
    if (hour >= byTwoHours[i]) {
      byTwoHoursLookup[byTwoHours[i]].push(date)
      break
    }
  }
})

console.log(byTwoHoursLookup)
代码语言:javascript
复制
<script src="https://momentjs.com/downloads/moment.min.js"></script>

票数 2
EN

Stack Overflow用户

发布于 2020-09-03 22:11:01

为什么不使用香草JS呢?

像这样的东西?

代码语言:javascript
复制
const pad = num => ("0"+num).slice(-2);
const times = `2020-09-02 02:22:14
2020-09-05 10:22:14
2020-09-03 06:22:14
2020-09-07 04:22:14
2020-09-02 11:22:14
2020-09-09 03:22:14
2020-09-03 10:22:14
2020-09-04 06:22:14
2020-09-02 07:22:14
2020-09-02 06:22:14
2020-09-02 10:22:14`.split("\n");

const hours = Array.from(Array(24).keys()).map(i => pad(++i)).filter(item => item%2===0)
//hours.push("00");// better change at the end
const schedule = hours.reduce((acc, hh) => {
  acc[`${hh}:00:00`] = times.filter(t => {
    const thh = t.match(/ (\d{2}):/)[1]*1
    const period = [+hh,+hh+2];
    return thh >= period[0] && thh < period[1];
  })
  return acc;
},{})
 console.log(schedule)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63724985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档