Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript ES6中的高效循环_Javascript_Loops_Ecmascript 6 - Fatal编程技术网

JavaScript ES6中的高效循环

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

我知道有很多方法可以在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.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));