我有一个网络套接字,我可以随机接收股票价格(例如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;
答案 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);