我有一个记录器,每 5 秒写入一次数据。
它有两个用途:
- 获取最新数据记录
- 获取 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/