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



>我有一个记录器,每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);

最新更新