我试图用来自交易所的数据和Google图表制作一个市场深度图。
好消息是我让它起作用了,但坏消息是准备谷歌图表使用的数据的代码是坏的。我知道应该有更好的方法来做这件事,但我无法找到正确的解决办法。
原始数据如下:
{bids: [[price, amount], [price, amount], ...],
asks: [[price, amount], [price, amount], ...]}谷歌图表需要这样的信息:
[[price, bid, ask], [price, bid, ask], ...]我有以下(丑陋的)代码:
var newData = [['price', 'bid', 'ask']];
var t = 0;
var tt = [];
var p = [];
for (var i = data.bids.length -1; i > -1; i--) {
t += data.bids[i][1];
tt.push(t);
p.push(data.bids[i][0])
}
var ii = 0;
for (var i = tt.length - 1; i >= 0; i--) {
newdData.push([p[ii], tt[i],null])
ii++;
};
t = 0;
for (var i = data.asks.length -1; i > -1; i--) {
t += data.asks[i][1];
newData.push([data.asks[i][0], null, t]);
}如果我用newData创建一个谷歌图表,它就会像预期的那样工作。如何使代码更好或更高效?
发布于 2015-04-17 22:20:42
我花了一些时间查看您的代码并重写它。
我的第一个建议是,尽量使您的代码更详细一些。它只写一次,一遍又一遍。非常重要的是,代码应该通过变量命名或注释来传达它应该做的事情。可读性代码的艺术是一本关于这个主题的好书,“实现模式”也对它进行了全面的介绍。
So...you可以尝试这样做:
function newAlgorithm(data){
// Intial row needs data for headers
var newData = [['price', 'bid', 'ask']],
// Optimizes for loops
entriesCount = data.bids.length,
// Will be calculcated later on
bidAmountSum = 0,
askAmountSum = 0,
// Will contain all entries that should be pushed into the final array
bidEntries = [],
askEntries = [];
// Calculate bid and ask sums
for(var i = 0; i < entriesCount; i++){
bidAmountSum += data.bids[i][1];
askAmountSum += data.asks[i][1];
}
// Create bid and ask entries for each one in one pass, since their count is the same
for(var i = 0; i < entriesCount; i++){
// Pid price is iterated in reverse
// Bid amount sum is cumulative sum of previous bids for each point in iteration
bidEntries.push([data.bids[data.bids.length-1 - i][0], bidAmountSum, null]);
bidAmountSum -= data.bids[i][1];
// Price is iterated in forward order
// Ask amount sum is cumulative sum of previous asks for each point in iteration
askEntries.push([data.asks[i][0], null, askAmountSum]);
askAmountSum -= data.asks[i][1];
}
return newData.concat(bidEntries).concat(askEntries.reverse());
}我测试了在用NodeJS运行时测试它的性能。我将数据集从100项增加到2 000 000项。

我还在这里做了浏览器测试:http://jsperf.com/chart-data-repacking
我希望这能帮到你。
https://codereview.stackexchange.com/questions/87244
复制相似问题