2017-08-27 1 views
0

Poloniex.returnTickerエンドポイントに接続する単純な抽出関数を実装しようとしていて、 'BTC'で始まる通貨ペアの 'last'キーを抽出します。 'BTC'で始まるいくつかのキーがありますが、私の抽出機能はちょうど1つのキーを返した後に停止しています。私は次のようにオブジェクトに抽出されたデータをマッピングしています:Objectのフィルタキー

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

Iは、抽出のために次の関数を書いた:参考のため

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 

を、各コールは、以下にティッカーエンドポイント戻りデータを返します形式:Poloniex API。例えば、returnTickerエンドポイントを見てください。

抽出機能に論理エラーがあると推測していますが、どこがわからないのですか。

答えて

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]]]] 
+0

あなたの提案の問題は、 'tickerdata [marker]'が 'undefined'になることです。 tickerdataオブジェクトにはそのようなフィールドはありません。各キーは、キーがBTC_STR、USDT_STRなどの形式の通貨ペアです。抽出機能では、最初に通貨ペアを分離し、基本通貨(BTC、USDT)を識別する必要があります。基本通貨ごとに、宛先通貨の情報(この例ではSTR)がマップされます。明確にするために、 '抽出された'オブジェクトは、抽出されたデータを格納するために使用したいオブジェクトです。 –

+0

あなたの「新しい」要件を満たす答えが更新されました)) – Ali

0

結果には、最終的にはそれを動作させることができました。 tickerdataのAPI応答オブジェクトからデータを抽出するためのコードを追加するだけでなく、resolveの代わりに約束をreturnに変更しました。これにより、流れが適切な順序で維持されることが保証された。 promisethen句を使用して、という名前のextracted値を取得しました。

`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); 
      }); 
    });  
}, 

};` 
関連する問題