Javascript 计算在过去30秒内接收的数据数
我有一个websocket,我随机收到股票价格,比如300毫秒,有时是1秒钟。我只想计算我在过去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时间戳,从中减
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)
。或者,如果您希望从函数返回长度,也可以这样做。