JavaScript ES6中的高效循环
我知道有很多方法可以在JS中循环,但我使用的是PHP风格,因此我的代码如下所示:JavaScript ES6中的高效循环,javascript,loops,ecmascript-6,Javascript,Loops,Ecmascript 6,我知道有很多方法可以在JS中循环,但我使用的是PHP风格,因此我的代码如下所示: let tickers = ['BTC/USDT','ETH/BTC','CELR/BTC',....] // comes as object from API const exclude = ['MATIC', 'CELR'] Object.keys(tickers).map(function(key) { for (var base in exclude) { if ( key.in
let tickers = ['BTC/USDT','ETH/BTC','CELR/BTC',....] // comes as object from API
const exclude = ['MATIC', 'CELR']
Object.keys(tickers).map(function(key) {
for (var base in exclude) {
if ( key.includes(exclude[base]) ) {
delete tickers[key]
}
}
})
预期股票价格=['BTC/USDT','ETH/BTC',…]
代码可以工作,但是在JS中有更有效的方法来实现这一点?因为这里有数组,有更好的方法来迭代它们,在数组上使用对象方法效率很低。还可以使用
delete
创建稀疏数组,这可能是不需要的。相反,您可以过滤掉包含一些排除项的标记(这样也可以避免使用稀疏数组):
但是,当您要求高效的代码时,您可以创建一组排除项,并检查是否与ticker的第一部分(在/)完全匹配:
(是否有效取决于您拥有的确切规则)如果“来自API的对象”表示您实际获得
{'BTC/USDT': …, 'ETH/BTC': …, 'CELR/BTC': …, …}
而不是你在问题中表现出来的
['BTC/USDT', 'ETH/BTC', 'CELR/BTC', …]
然后删除
和对象。键
很好,尽管您:
- 不应将
用于副作用(尤其不应仅用于副作用)–map
同样兼容forEach
- 不应使用
循环来迭代数组,如for…in
exclude
let
/const
,因此很有可能用于
的…和对象。条目
可用:
for (const [key, value] of Object.entries(tickers)) {
for (const base of exclude) {
if (key.includes(base)) {
delete tickers[key]
break
}
}
}
然后,如果您希望用与排除列表的大小不成比例的时间来替换内部循环,并且考虑到您似乎能够通过在
/
上拆分来从键中提取要检查的候选列表,您可以使用其他答案中所述的集合。您要求的高效,因此,您应该查看哪个提供了O(1)
查找时间
以下程序将排除任一货币与排除值匹配的任何股票代码。例如,排除CELR
将删除下面的CELR/BTC
和FOO/CELR
-
const filterTickers=(不包括=[],tickers=[])=>{
常量s=新集合(不包括)
返回tickers.filter(t=>t.split('/')。每个(x=>!s.has(x)))
}
常数结果=
过滤器标签(['MATIC'、'CELR']、['BTC/USDT'、'ETH/BTC'、'CELR/BTC'、'FOO/CELR'])
console.log(结果)
//[“BTC/USDT”、“ETH/BTC”]
为了减少您可以使用的函数和方法
let tickers=['BTC/USDT'、'ETH/BTC'、'CELR/BTC'];
const exclude=['MATIC','CELR'];
tickers=tickers.filter((ticker,i)=>exclude.every((v)=>ticker.indexOf(v)=-1));
console.log(tickers)
您对tickers
和exclude
有什么价值吗?我不确定您想做什么,但包含()
是一种数组方法,键
是字符串过滤器
可能是更好的选择。@slebetman有一个字符串。原型。也包括对象。键(ticker)
将返回值“0”、“1”、“2”
。。。它永远不会包含(includes())字符串“BTC/USDT”。规则是排除处于排除状态的任何对,无论位置是BTC/USD/BTC@calcu但它总是其中的一部分?因此,排除项永远不会是“BTC/USD”,但例如,“USD”也必须排除“BTC/USD”?@Jonaswillms对,股票代码总是以货币对出现,以/
分隔,但排除项列表是单一货币
['BTC/USDT', 'ETH/BTC', 'CELR/BTC', …]
for (const [key, value] of Object.entries(tickers)) {
for (const base of exclude) {
if (key.includes(base)) {
delete tickers[key]
break
}
}
}
let tickers = ['BTC/USDT','ETH/BTC','CELR/BTC',....];
const exclude = ['MATIC', 'CELR'];
tickers = tickers.filter((ticker, i) => exclude.every((v) => ticker.indexOf(v) == -1));