过滤对象中的键

时间:2017-08-27 00:32:41

标签: node.js filtering

我正在尝试实现一个连接到Poloniex.returnTicker端点的简单提取函数,并为以“BTC”开头的任何货币对提取“last”键。有许多键以'BTC'开头但是,我的提取功能在返回一个键之后就停止了。我按以下方式将提取的数据映射到对象中:

extracted = {
    BTC: {
        STR: {
            lastPrice: price
         },
         ETH: {
            lastPrice: price
         }, //...
   }, //...
}

我为提取编写了以下函数:

module.exports = {
extractData: (tickerdata, marker) => {
    if(!!!marker){
        marker = 'BTC';
    }
    return new Promise((res, rej) => {
        let currentBuffer = {};
        Object.keys(tickerdata)
            .filter((key) => {
                return key.startsWith(marker);
            })
            .forEach((filtKey) => {
                let c = filtKey.split('_'),
                    src = c[0],
                    dst = c[1];
                currentBuffer[src] = {};
                Object.keys(tickerdata[filtKey])
                    .forEach((entry) => {
                        if(!!!(dst in currentBuffer[src])){
                            currentBuffer[src][dst] = {};
                        }
                        if(entry == 'last'){
                            currentBuffer[src][dst]['lastPrice'] = tickerdata[filtKey][entry];
                        }

                    });
            });
            res(currentBuffer);
    });
},//... rest of the module exports

作为参考,每次调用返回ticker端点都会返回以下格式的数据:Poloniex API。例如,查看returnTicker端点。

我猜测提取函数中存在逻辑错误,但我不知道在哪里。

2 个答案:

答案 0 :(得分:1)

更新

这段代码怎么样?

module.exports = {
    extractData: (tickerdata, marker) => 
        Object.keys(tickerdata)
            .map(x => x.split('_'))
            .filter(x => x && x[0] == (marker || 'BTC') && x[1])
            .map(x => x[0] + '_' + x[1])
            .map(x => [x, Object.keys(tickerdata[x])
                .map(y => [y, tickerdata[x][y].lastPrice])]);

和用法:

const extracted = {
    ETH_STR: {
        BTC: {
            lastPrice: 1
        }
    },
    BTC_ETH: {
        STR: {
            lastPrice: 1
        }
    },
    BTC_STR: {
        STR: {
            lastPrice: 1
        },
        ETH: {
            lastPrice: 2
        }, //...
    }, //...
};

const result = extractData(extracted, 'BTC');
console.log(JSON.stringify(result));

结果

[["BTC_ETH",[["STR",1]]],["BTC_STR",[["STR",1],["ETH",2]]]]

答案 1 :(得分:0)

我对我的代码进行了修改,最终能够使其工作。除了添加更多用于从API响应对象tickerdata中提取数据的代码之外,我已将承诺更改为return而非resolve。这确保了流动保持适当的顺序。我在then上使用了promise子句来检索extracted值(名为buff)。以下是完整的工作代码:

`module.exports = {
extractData: (markers) => {
    // extracts the data for all markers which, are a comma separated string of base currencies
    return new Promise((res, rej) => {
        markers = (!!!(markers) ? 'USDT,BTC' : markers)
        polinst.returnTicker()
            .then((tickerdata) => {
                let buff = {};
                markers.split(',').forEach((marker) => {
                    Object.keys(tickerdata)
                    .filter((key) => {
                        return key.startsWith(marker);
                    })
                    .forEach((fkey) => {
                        let c = fkey.split('_'),
                            src = c[0],
                            dst = c[1];
                        buff[src] = (!!!(buff[src]) ? {} : buff[src]);
                        buff[src][dst] = (!!!(buff[src][dst]) ? {} : buff[src][dst]);
                        Object.keys(tickerdata[fkey])
                            .forEach((k) => {
                                if(k == 'last'){
                                    buff[src][dst]['lastPrice'] = tickerdata[fkey][k];
                                }
                                else if(k == 'quoteVolume'){
                                    buff[src][dst]['volume'] = tickerdata[fkey][k];
                                }
                                else if(k == 'lowestAsk'){
                                    buff[src][dst]['ask'] = tickerdata[fkey][k];
                                }
                                else if(k == 'highestBid'){
                                    buff[src][dst]['highestBid'] = tickerdata[fkey][k];
                                }
                            });
                    });
                });
                return buff;
            }).then((d)=>{
                res(d);
            }).catch((err)=>{
                console.log(err);
            });
    });    
},

};`