首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有效数据迁移

有效数据迁移
EN

Code Review用户
提问于 2015-04-17 17:18:54
回答 1查看 125关注 0票数 0

我试图用来自交易所的数据和Google图表制作一个市场深度图。

好消息是我让它起作用了,但坏消息是准备谷歌图表使用的数据的代码是坏的。我知道应该有更好的方法来做这件事,但我无法找到正确的解决办法。

原始数据如下:

代码语言:javascript
复制
{bids: [[price, amount], [price, amount], ...],
 asks: [[price, amount], [price, amount], ...]}

谷歌图表需要这样的信息:

代码语言:javascript
复制
[[price, bid, ask], [price, bid, ask], ...]

我有以下(丑陋的)代码:

代码语言:javascript
复制
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创建一个谷歌图表,它就会像预期的那样工作。如何使代码更好或更高效?

EN

回答 1

Code Review用户

回答已采纳

发布于 2015-04-17 22:20:42

我花了一些时间查看您的代码并重写它。

我的第一个建议是,尽量使您的代码更详细一些。它只写一次,一遍又一遍。非常重要的是,代码应该通过变量命名或注释来传达它应该做的事情。可读性代码的艺术是一本关于这个主题的好书,“实现模式”也对它进行了全面的介绍。

So...you可以尝试这样做:

代码语言:javascript
复制
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

我希望这能帮到你。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/87244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档