以5分钟为间隔对数组进行排序,具有唯一值计数

时间:2017-06-13 14:56:49

标签: javascript typescript

我正在尝试对数组进行排序,以便在当天开始时从0:00开始的5分钟间隔内获取唯一用户的计数。 我如何定义纪元时间的5分钟间隔? (使用的数据将是当天的纪元时间)以及如何获得该时间间隔的唯一用户数?

输入

[1486428994000, "user a"]    

[1486429834000, "user a"]

[1486429839000, "user a"]

[1486429869000, "user b"]

所需的输出

[1486428900000, 1 ]

[1486429800000, 2 ]

3 个答案:

答案 0 :(得分:1)



// Remove doublons from an array.
const uniq = array =>
  array.filter((value, index) => array.indexOf(value) === index);

// Your function.
const groupCount = (data, timeWindow) =>
  data
    .reduce((groups, line) => {
      const current = groups[groups.length - 1];
      // If the line is outside of the current time window, push a new group.
      if (!current || line[0] > current[0] + timeWindow) {
        // Find the beginning of the corresponding time window.
        const windowStart = line[0] - line[0] % timeWindow;
        // Push the new group.
        groups.push([windowStart, [line[1]]]);
      } else {
        // Else add a new user to the group.
        current[1].push(line[1]);
      }
      return groups;
    }, [])
    // Once we created the groups, we remove doublons from them and count users.
    .map(group => [group[0], uniq(group[1]).length]);

const data = [
  [1486428994000, "user a"],
  [1486429834000, "user a"],
  [1486429839000, "user a"],
  [1486429869000, "user b"]
];
console.log(groupCount(data, 5 * 60 * 1000));




答案 1 :(得分:0)

要设置重复计时器,您可以使用setInterval(function(){},_timeout_)

var T = setInterval(function(){
 /* code here */
}, 1e3*60*5);

1e3 = 1000(毫秒)
x 60(秒)
x 5(分钟)

对于Javascript中的“now”,您可以使用:

new Date().valueOf()

取决于您使用的纪元类型,您可能必须将其除以或乘以100

要获取唯一值,您可以使用.reduce() https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

使用客户端计时器:

你的JS时间戳需要机器时间,所以如果客户机的机器日期/时间关闭,你的计算将是错误的 - 解决这个问题的最佳方法是向前端发送服务器时间戳并将其转换为一个javascript日期对象并使用它,而不是客户端的机器时间。

如上所述,纪元时间戳因服务器软件而异,因此您可能需要调整服务器端或客户端(通常相差100倍)

答案 2 :(得分:0)

使用一些时间戳逻辑和一些数组魔术,您可以将其关闭。虽然下面的解决方案返回正确的输出,但我觉得最后的地图并不是完全必要的。如果有人想扩展我的解决方案,请随意。

var raw = [
  [1486428994000, "user a"],
  [1486429834000, "user a"],
  [1486429839000, "user a"],
  [1486429869000, "user b"]
];
raw.map(a=> a[0] = parseInt(a[0] / (5 * 60 * 1000)) * (5 * 60 * 1000));
raw = raw.reduce(function(a,b) {
  if(!a[b[0]]) a[b[0]] = {users: [], count: 0};
  if(a[b[0]].users.indexOf(b[1]) === -1) { a[b[0]].users.push(b[1]); a[b[0]].count++; }
  return a;
}, {});
var ret = [];
for(var i in raw) {
  ret.push([i, raw[i].count]);
}
console.log(ret);