我在尝试减少数据流时一直面临编码问题。下面是示例代码
数据在交换的基础上被过滤,现在我需要过滤掉未在对数组中给出的对。
//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));
我需要减少“对”数组的基础上的结果,其中包含对只能到达对象。
更新结果必须是
var dataStream = {
"Coinbase": { "pairs": { "ETH": ["USD", "GBP", "BTC"], "LTC": ["GBP", "BTC", "USD", "EUR"] } },
"Binance": { "pairs": { "ETH": ["USD", "BTC"], "LTC": ["GBP", "BTC"]} }
};
如果有人可以提供帮助或提供线索,我将不胜感激。谢谢你的时间。
您可以尝试使用Object.entries、Array.includes和Array.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);
或者您可以简单地将 for 循环与Array.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"] } }};
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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句