javascript - 是否有更清晰的方法来从这样的数组计算用户 session 长度?

标签 javascript algorithm

我有一个事件数组,其中每个事件都有一个操作(登录/注销)和时间戳。

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/

相关文章:

javascript - 如何在 jQuery 中创建哈希电子邮件?

javascript - 使用 Jquery 实现标签

algorithm - Zillow 中的范围搜索

java - 特定旅行商变体的实现

algorithm - 如何生成具有多个成功路径的迷宫?

javascript - AngularJS 未在数组中找到值

javascript - *Highchart* 连续下载两次时图表颜色变化

Python - 压缩 Ascii 字符串

algorithm - 在集合中查找最小值/最大值时,使用一种类型的最小值/最大值

javascript - 如何选择所有输入并按 id 或 class 选择单个或多个 div 内的元素