我有一个事件数组,其中每个事件都有一个操作(登录
/注销
)和时间戳。
const events = [
{ action: 'login', timestamp: 10 },
{ action: 'logout', timestamp: 20 },
{ action: 'login', timestamp: 55 },
{ action: 'logout', timestamp: 65 },
]
我正在尝试编写一个计算用户 session 总长度的函数,该长度由登录
和注销
之间的差异定义。 登录
始终出现在注销
之前。
function getUserSessionLength(events) {
let userSession = 0
let lastTimeLogIn = 0
for (const { action, timestamp } of events) {
if (action === 'login') lastTimeLogIn = timestamp
else userSession += timestamp - lastTimeLogIn
}
return userSession
}
这可行,但我想知道是否有更简单或更清晰的方法来计算它?现在我需要使用一个额外的变量来在遍历数组时跟踪上次登录时间戳。
最佳答案
如果login
事件后面始终跟随 logout
事件,您可以简单地减去 login
的总和来自 logout
总和的时间戳时间戳:
const events = [
{ action: 'logout', timestamp: 3 },
{ action: 'login', timestamp: 10 },
{ action: 'logout', timestamp: 20 },
{ action: 'login', timestamp: 55 },
{ action: 'logout', timestamp: 65 },
{ action: 'login', timestamp: 85 },
]
userSessionLength = events
// make sure we start with login
.slice(events.findIndex(e => e.action == 'login'),
events.length - events.slice(0).reverse().findIndex(e => e.action == 'logout'))
.reduce((acc, { action, timestamp }) => acc + (action == 'logout' ? timestamp : -timestamp)
, 0)
console.log(userSessionLength)
关于javascript - 是否有更清晰的方法来从这样的数组计算用户 session 长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73725861/