我正在尝试实现一个连接到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端点。
我猜测提取函数中存在逻辑错误,但我不知道在哪里。
答案 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);
});
});
},
};`