繁体   English   中英

减少对象和嵌套对象:javascript

[英]Reduce objects and nested objects : javascript

我在尝试减少数据流时一直面临编码问题。 下面是示例代码

数据是在交换的基础上进行过滤的,现在我需要过滤掉未在对数组中给出的对。

//data stream
var dataStream = {
  "Coinbase": { "pairs": { "ETH": ["USD", "GBP", "BTC"], "DAI": ["USDC"], "LTC": ["GBP", "BTC", "USD", "EUR"], "ETC": ["EUR", "BTC", "USD"] } },
  "Binance": { "pairs": { "ETH": ["USD", "BTC"], "DAI": ["USDC"], "LTC": ["GBP", "BTC"], "ETC": ["EUR"] } },
  "CoinCorner": { "pairs": { "BTC": ["GBP", "EUR","LTC"] } }
};
//allowed exchages
    var exchanges = ["Coinbase", "Binance", "Bitstamp"];
//allowed pairs
var pair = ["BTC","ETH","LTC"];

const filtered = Object.keys(dataStream)
  .filter(key => exchanges.includes(key))
  .reduce((obj, key) => {
    obj[key] = dataStream[key].pairs;//do some reduction
    return obj;
  }, {});

console.log("data filtered:" + JSON.stringify(filtered));

我需要在“ pair”数组的基础上减少结果,其中包括pairs只能到达对象。

更新结果必须为

var dataStream = {
        "Coinbase": { "pairs": { "ETH": ["USD", "GBP", "BTC"], "LTC": ["GBP", "BTC", "USD", "EUR"] } },
          "Binance": { "pairs": { "ETH": ["USD", "BTC"], "LTC": ["GBP", "BTC"]} }
       };

如果有人可以提供帮助或提供线索,我将很感激。 谢谢你的时间。

我似乎克隆了原始数据,但这似乎是可行的,只是为了确保我不变异原始数据

var dataStream = {
  "Coinbase": { "pairs": { "ETH": ["USD", "GBP", "BTC"], "DAI": ["USDC"], "LTC": ["GBP", "BTC", "USD", "EUR"], "ETC": ["EUR", "BTC", "USD"] } },
  "Binance": { "pairs": { "ETH": ["USD", "BTC"], "DAI": ["USDC"], "LTC": ["GBP", "BTC"], "ETC": ["EUR"] } },
  "CoinCorner": { "pairs": { "BTC": ["GBP", "EUR"] } }
};
//allowed exchages
var exchanges = ["Coinbase", "Binance", "Bitstamp"];
//allowed pairs
var allowedPairs = ["BTC","ETH","LTC"];

var clonedStream = JSON.parse(JSON.stringify(dataStream))

const filtered = Object.keys(clonedStream)
  .filter(key => exchanges.includes(key))
  .reduce((obj, key) => {
    var filteredPairs = {pairs: {}};

    for(let p of allowedPairs) {
      filteredPairs['pairs'][p] = dataStream[key].pairs[p] || []
    }

    obj[key] = filteredPairs;
    return obj;
  }, {});

console.log(JSON.stringify(filtered));

结果是

{
   "Coinbase":{
      "pairs":{
         "BTC":[

         ],
         "ETH":[
            "USD",
            "GBP",
            "BTC"
         ],
         "LTC":[
            "GBP",
            "BTC",
            "USD",
            "EUR"
         ]
      }
   },
   "Binance":{
      "pairs":{
         "BTC":[

         ],
         "ETH":[
            "USD",
            "BTC"
         ],
         "LTC":[
            "GBP",
            "BTC"
         ]
      }
   }
}

您可以尝试使用Object.entriesArray.includesArray.reduce

 var dataStream = {"Coinbase": { "pairs": { "ETH": ["USD", "GBP", "BTC"], "DAI": ["USDC"], "LTC": ["GBP", "BTC", "USD", "EUR"], "ETC": ["EUR", "BTC", "USD"] } },"Binance": { "pairs": { "ETH": ["USD", "BTC"], "DAI": ["USDC"], "LTC": ["GBP", "BTC"], "ETC": ["EUR"] } },"CoinCorner": { "pairs": { "BTC": ["GBP", "EUR"] } }}; var exchanges = ["Coinbase", "Binance", "Bitstamp"]; var pair = ["BTC","ETH","LTC"]; let result = Object.entries(dataStream).reduce((a,[k,v]) => { if(exchanges.includes(k)) { a[k] = Object.entries(v.pairs).reduce((ac,[kc,vc]) => { if(pair.includes(kc)) ac[kc] = vc; return ac; },{}); } return a; }, {}); console.log(result); 

或者您可以简单地使用Array.includes的for循环

 var dataStream = {"Coinbase": { "pairs": { "ETH": ["USD", "GBP", "BTC"], "DAI": ["USDC"], "LTC": ["GBP", "BTC", "USD", "EUR"], "ETC": ["EUR", "BTC", "USD"] } },"Binance": { "pairs": { "ETH": ["USD", "BTC"], "DAI": ["USDC"], "LTC": ["GBP", "BTC"], "ETC": ["EUR"] } },"CoinCorner": { "pairs": { "BTC": ["GBP", "EUR"] } }}; var exchanges = ["Coinbase", "Binance", "Bitstamp"]; var pair = ["BTC","ETH","LTC"]; let result = {}; for (let exchange in dataStream) { if(exchanges.includes(exchange)) { result[exchange] = {}; for (let p in dataStream[exchange].pairs) { if(pair.includes(p)) result[exchange][p] = dataStream[exchange].pairs[p]; } } } console.log(result); 

编辑

根据所需的更新结果,您可以尝试以下操作。 请注意,将对数组转换为对象有助于提高性能,因为它避免了每次搜索都使用includes操作。

 var dataStream = {"Coinbase": { "pairs": { "ETH": ["USD", "GBP", "BTC"], "DAI": ["USDC"], "LTC": ["GBP", "BTC", "USD", "EUR"], "ETC": ["EUR", "BTC", "USD"] } }, "Binance": { "pairs": { "ETH": ["USD", "BTC"], "DAI": ["USDC"], "LTC": ["GBP", "BTC"], "ETC": ["EUR"] } }, "CoinCorner": { "pairs": { "BTC": ["GBP", "EUR","LTC"] } }}; var exchanges = ["Coinbase", "Binance", "Bitstamp"]; var pair = ["BTC","ETH","LTC"]; let pairObj = pair.reduce((a,c) => Object.assign(a, {[c] : c}), {}); for (let d in dataStream) { if(exchanges.includes(d)) { let pairs = dataStream[d].pairs; for(let p in pairs) { // if the pair exists in pairObj proceed to check in its value, else remove from object if(pairObj[p]) { // filter the values based on entries in pairObj let r = pairs[p].filter(v => pairObj[v]); // If there was existing value, update the object else remove it from object if(r.length) pairs[p] = r; else delete pairs[p]; } else delete pairs[p]; } } else delete dataStream[d]; } console.log(dataStream); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM