计算过去30秒内收到的数据数量

时间:2019-01-28 03:26:20

标签: javascript

我有一个网络套接字,我可以随机接收股票价格(例如300毫秒或有时是1秒)。我只想计算过去30秒钟内收到的价格。

var arr = [];

function onReceive(price) {
 var timestamp = Number(new Date());
  arr[timestamp] = [];
  arr[timestamp].push(price);
  
  if (arrarr[timestamp].length > 1000) {
    arr.shift();
  }
}

现在,我只想计算过去30秒钟内收到了多少价格,我无法提出任何逻辑。

我尝试过将数组中的最后30个项目切成薄片,并计算最后一个时间戳和-30个时间戳之间的差,这告诉我接收30个价格变动需要花费多少时间,但是我不知道该如何计算在过去30秒钟内收到了许多滴答声,请提出任何想法。谢谢。

 arr[timestamp][arr[timestamp].length-1].key-arr[timestamp][0].key;

1 个答案:

答案 0 :(得分:1)

我个人将为一个日志项目创建某种命名实例,其中包含UNIX时间戳和价格。

要在最近的X秒内检索任何内容,您将获得 current UNIX时间戳,从中减去X * 1000,并使用.filter() 进行反向迭代以检索时间戳大于该值的所有项目。

编辑:如Robby所指出的那样,由于可以保证时间戳按递增顺序排列,因此无需搜索整个数组。通过反向迭代,我们可以在所需窗口之外找到第一个结果时退出循环。

var priceLog = [];

function PriceLogItem(price) {
  this.price = price;
  this.timestamp = new Date().getTime();
}

function onReceive(price) {
  priceLog.push(new PriceLogItem(price));
  if (priceLog.length > 1000) log.shift();
}

function getPriceLogsSince(secondsAgo) {
  let millisecondsAgo = secondsAgo * 1000;
  let time = new Date().getTime() - millisecondsAgo;

  let result = [];
  for (let i = priceLog.length - 1; i >= 0; i--) {
    if (priceLog[i].timestamp >= time) result.push(priceLog[i]);
    else break;
  }
  return result;
}

//Usage
let priceLogs = getPriceLogsSince(30);   //Get all logs within past 30 seconds
console.log(priceLogs);