Javascript 计算在过去30秒内接收的数据数

Javascript 计算在过去30秒内接收的数据数,javascript,Javascript,我有一个websocket,我随机收到股票价格,比如300毫秒,有时是1秒钟。我只想计算我在过去30秒内收到的价格 var arr=[]; 函数onReceive(价格){ var timestamp=Number(新日期()); arr[时间戳]=[]; arr[时间戳].推送(价格); if(arrarr[时间戳].长度>1000){ arr.shift(); } }我个人会为日志项创建某种命名实例,保存UNIX时间戳和价格 要在最后X秒内检索任何内容,您需要获取当前UNIX时间戳,从中减

我有一个websocket,我随机收到股票价格,比如300毫秒,有时是1秒钟。我只想计算我在过去30秒内收到的价格

var arr=[];
函数onReceive(价格){
var timestamp=Number(新日期());
arr[时间戳]=[];
arr[时间戳].推送(价格);
if(arrarr[时间戳].长度>1000){
arr.shift();
}

}
我个人会为日志项创建某种命名实例,保存UNIX时间戳和价格

要在最后X秒内检索任何内容,您需要获取当前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);

使用时间戳键创建稀疏数组似乎不是一个好主意。时间戳的格式是什么?如果是unix时间,数组长度将立即超过1548646220。1)按时间戳排序数组2)按最近的时间戳排序30秒3)迭代数组并忽略任何时间戳超出30秒边界的项。@ScottMarcus按时间戳排序数组?它已经按时间戳排序。嗨,这是当前的时间戳,我已经更新了我的问题,这只是演示,如果需要,我将创建对象,谢谢。谢谢你更新你的问题。目前唯一尚不清楚的是:在这种情况下使用稀疏阵列是否是一种设计选择?可能有支持和反对的有效论据,但如果不知道这是否是您真正想要做的,就不可能说哪种解决方案适合您。由于时间戳保证会增加,数组的反向迭代将比使用
过滤器()
高效得多。您好,我只需要过去30秒的计数,我可以返回正确的计数吗?在底部,只需将
console.log(priceLogs)
更改为
console.log(priceLogs.length)
。或者,如果您希望从函数返回长度,也可以这样做。