简体   繁体   English

减少对象和嵌套对象:javascript

[英]Reduce objects and nested objects : javascript

i have been facing coding issue while trying to reduce the data stream. 我在尝试减少数据流时一直面临编码问题。 Below is the sample code 下面是示例代码

Data is being filtered on the base of exchanges, now i need to filter out the pairs not given in pair array. 数据是在交换的基础上进行过滤的,现在我需要过滤掉未在对数组中给出的对。

//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));

I needed to reduce the result on the base of 'pair' array where including pairs only get to the object. 我需要在“ pair”数组的基础上减少结果,其中包括pairs只能到达对象。

Update Result must be 更新结果必须为

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

If someone can help or give clue, i will be thankful. 如果有人可以提供帮助或提供线索,我将很感激。 Thanks for your time. 谢谢你的时间。

This seems to be working, I cloned original data, just to be sure that I don't mutate the original data 我似乎克隆了原始数据,但这似乎是可行的,只是为了确保我不变异原始数据

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));

The result is 结果是

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

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

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

You can try following using Object.entries , Array.includes and Array.reduce 您可以尝试使用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); 

Or you can simply use a for loop with Array.includes 或者您可以简单地使用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); 

Edit 编辑

Based on updated result required, you can try following. 根据所需的更新结果,您可以尝试以下操作。 Please note, converting pair array into object helps in improving performance as it avoids using includes operation every time to search. 请注意,将对数组转换为对象有助于提高性能,因为它避免了每次搜索都使用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