Javascript 确保日志条目之间经过 N 秒

标签 javascript

我有一个记录器,每 5 秒写入一次数据。

它有两个用途:

  1. 获取最新数据记录
  2. 获取 1 个月或一周的记录。

所以,我希望它始终保留最新的书面记录,但要确保记录之间的时间范围(不包括最后一个)至少为一分钟。为此,我想定期运行数据库清理脚本。

需要有关算法的帮助,该算法将删除时间戳太接近的数据库条目。

删除所有记录的示例不起作用:)

let wasRemoved: boolean = true;
while(wasRemoved) {
    const logs = await logsRepository.find({parent: {id: parents[0].id}});
    const startL = logs.length;
    console.log('start: ' + startL);
    for (let i = 0; i < logs.length - 2; i++) {
        if (i + 1 < logs.length-2 &&
              DataHelpers.getSecondsBetweenDates(logs[i].createdAt, logs[i+1].createdAt) < 60) {
            console.log(DataHelpers.getSecondsBetweenDates(logs[i].createdAt, logs[i+1].createdAt));
            logs.splice(i+1, 1);
            wasRemoved = true;
            await logsRepository.delete(logs[i+1].id);
        }
    }
    if (startL === logs.length) wasRemoved = false;
    console.log('end: ' + logs.length);
}

基本上它总是删除下一条记录。请帮助使用正确的算法来解决这个问题。

谢谢!

最佳答案

您可以使用.reduce()过滤日志:只需将过滤后的数组保留为累加器,并在每次迭代时比较当前和最后过滤元素的 createdAt 字段:

const logs = [
  {createdAt: 0}, 
  {createdAt: 10}, 
  {createdAt: 30}, 
  {createdAt: 70}, 
  {createdAt: 80}, 
  {createdAt: 90},
  {createdAt: 140},
  {createdAt: 200},
  {createdAt: 210},
  {createdAt: 220}
];

const filtered = logs.reduce((filtered, cur, i, array) => {
  if (!filtered.length || 
      i === array.length - 1 || 
      cur.createdAt - filtered[filtered.length - 1].createdAt >= 60) {
    filtered.push(cur);
  }
  return filtered;
}, []);

console.log(filtered);

关于Javascript 确保日志条目之间经过 N 秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58480144/

相关文章:

javascript - AngularJs - 修改输入格式的指令

javascript - 使用 Fabric.js 显示适用的控件

javascript - 在 JavaScript 中获取高度或宽度的子像素值

javascript - 内容脚本在 Chrome 扩展中不起作用

javascript - 警报框引用值

javascript - mysql查询后 promise 警告

javascript - 更改必填字段中的弹出消息

javascript - 如何在此处的 map 中检索我所在国家/地区的结果?

javascript - 如何在 Javascript 中重写此函数

javascript - setTimeout(0) vs window.postMessage vs MessagePort.postMessage