如何解决如何在javascript中计算y时间内x个事件的数量?
我有一个接收事件的类,我们称它为“ EVENT_X”。
它可以在任何持续时间内多次接收到此事件,但是我需要知道它是否超过阈值,让它在5分钟内说出10次“ EVENT_X”事件,因此我可以采取相应措施。
我无法为此找到合适的算法,而且效率很高,我只是尝试等待前10个事件到来,然后检查时间是否小于5,这当然不能解决目的
非常感谢您的帮助,谢谢!
解决方法
单击最后一个按钮时,将全局数组用作日期对象的堆栈。每次单击时,只会附加一个。如果至少有5个在最后5个上剪切,则查找从现在到第一次单击之间的差异(以毫秒为单位)。如果小于5000小于您想要的值,例如通过添加一个类来更改按钮的颜色或将其输出到控制台。
注意:如果您要慢一点(超过5秒),则必须更快地单击一些,直到最后5次点击为止。为了演示,我只需要5次点击和5秒钟,但是您可以轻松地将其更改为您的期望。
var counter = [];
document.getElementById('btn').addEventListener('click',function() {
let now = new Date();
counter.push(now);
if (counter.length >=5) {
counter = counter.slice(-5);
let diff = now - counter[0];
if (diff <= 5000) {
document.getElementById('btn').classList.add('x5');
console.log('Clicked 5x in the time.');
}
}
});
.x5 { background: yellow; }
<button id='btn'>Click it 5x</button>
,
因此添加一个对象并在事件发生时记录日志。添加事件时,请过滤掉5分钟以上的所有事件。检查长度。如果达到最大,请解雇下一步要做的事情。
const evtTypes = {};
function logEvent (event) {
const { type } = event;
evtTypes[type] = evtTypes[type] || [];
evtTypes[type].push({ ts: new Date().getTime(),data: event });
evtTypes[type] = evtTypes[type].filter(({ ts }) => new Date().getTime() - ts < 300000);
if (evtTypes[type].length >= 10) {
console.log(`"${event.type}" triggered 10 times in 5 minutes.`);
}
}
logEvent({ type: 'test',foo: 'bar01' });
logEvent({ type: 'test',foo: 'bar02' });
logEvent({ type: 'test',foo: 'bar03' });
logEvent({ type: 'test',foo: 'bar04' });
logEvent({ type: 'test',foo: 'bar05' });
logEvent({ type: 'test',foo: 'bar06' });
logEvent({ type: 'test',foo: 'bar07' });
logEvent({ type: 'test',foo: 'bar08' });
logEvent({ type: 'test',foo: 'bar09' });
logEvent({ type: 'test',foo: 'bar10' });
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。