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