Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果时间在时间戳范围内,则增加计数_Javascript - Fatal编程技术网

Javascript 如果时间在时间戳范围内,则增加计数

Javascript 如果时间在时间戳范围内,则增加计数,javascript,Javascript,我有一张时间图,在过去24小时内每隔30分钟计算一次键、值对,如下所示: const value = new Map() // 1614789680148 => 0, 1614791480148 => 0, 1614793280148 => 0, 1614795080148 => 0, 我从另一个函数填充这些值。我现在的问题是,我从api中获取的数据具有时间戳值,我需要检查时间戳是否在间隔内,如果在间隔内,则将其添加到计数中(最初都是0) 我从db获得的数组如下所示(这

我有一张时间图,在过去24小时内每隔30分钟计算一次键、值对,如下所示:

const value = new Map() // 1614789680148 => 0, 1614791480148 => 0, 1614793280148 => 0, 1614795080148 => 0,
我从另一个函数填充这些值。我现在的问题是,我从api中获取的数据具有时间戳值,我需要检查时间戳是否在间隔内,如果在间隔内,则将其添加到计数中(最初都是0)

我从db获得的数组如下所示(这是一个示例,但数组中有500多个元素):

这是我现在拥有的,但没有增加任何值:

arr.forEach(i => {
      const currentTimestamp = fromTime;

      value.forEach(timestamp => {
        if (
          moment(i.details.payload.createdTimestamp).isBetween(
            currentTime,
            moment(currentTimestamp)
              .add('30', 'm')
              .valueOf()
          )
        ) {
          value.set(
            timestamp,
            value.get(timestamp) + 1
          );
        }
      });
    });
编辑。 以下是我设置间隔的方式:

const fromTime = moment()
      .subtract(24, 'hours')
      .valueOf();
    const toTime = moment().valueOf();
    let currentTime = fromTime;

while (moment(currentTime).isBetween(fromTime, toTime, undefined, '[]')) {
        const thirtyMinutes = 30 * 60 * 1000;
        const key = Math.round(currentTime / thirtyMinutes) * thirtyMinutes;

        temp[i].value.set(key, 0);
currentTime = moment(currentTime)
          .add('30', 'm')
          .valueOf();
          }

首先,Map.forEach传递键和值。Value是第一个参数,key是第二个参数。您将时间戳分配给值,而不是键

其次,如果我正确理解了您的目标,那么将四舍五入调整到最接近的30分钟间隔可能比进行所有这些比较更有效:

arr.forEach(i=>{
持续三十分钟=30*60*1000;
const key=Math.round(i.details.payload.createdTimestamp/thirtyMinutes)*thirtyMinutes;
value.set(key,value.get(key)+1);
});

在我的第一个代码片段中已经设置了映射,键是30分钟间隔的时间戳,值是计数。我的问题是,我从api获取数据,我需要获取数据对象的时间戳,并通过增加countYep将其放入映射的正确间隔中。我的回答应该解决这个问题。我是说从API中取整createdTimestamp,这样你就不必在地图上迭代来找到匹配的键。这是一个聪明的想法,但是30分钟的间隔是在初始化时计算出来的,并且不是取整的。有没有办法使用过去24小时到第二个小时内的过去30分钟间隔来完成此操作?或者有没有办法设置值间隔以适合此解决方案?如何生成间隔?它们是来自什么东西吗?或者您只是基于当前时间创建它们?您可以执行const t=moment().startOf('day'),然后执行(i=0;i<24*2;i++)值。设置(t+i*30,0);
const fromTime = moment()
      .subtract(24, 'hours')
      .valueOf();
    const toTime = moment().valueOf();
    let currentTime = fromTime;

while (moment(currentTime).isBetween(fromTime, toTime, undefined, '[]')) {
        const thirtyMinutes = 30 * 60 * 1000;
        const key = Math.round(currentTime / thirtyMinutes) * thirtyMinutes;

        temp[i].value.set(key, 0);
currentTime = moment(currentTime)
          .add('30', 'm')
          .valueOf();
          }