JavaScript ES6中的高效循环

时间:2019-05-19 17:54:02

标签: javascript loops ecmascript-6

我看到有很多方法可以在JS中循环,但是我使用的是PHP样式,因此我的代码如下:

jobs

预期行情= ='BTC / USDT','ETH / BTC',......

代码有效,但是在JS中有更有效的方法吗?

4 个答案:

答案 0 :(得分:3)

因为这里确实有数组,所以有更好的方法来迭代它们,在数组上使用对象方法效率很低。同样使用delete创建一个稀疏数组,这可能是不需要的。取而代之的是,您可以过滤掉包含某些排除项的代码(这样还可以避免使用稀疏数组):

  tickers = tickers.filter(ticker => !exclude.some(other => ticker.includes(other)));

不过,当您需要有效的代码时,您可以创建一组排除对象,并检查代码的第一部分是否完全匹配(在/之前):

  const excludeSet = new Set(exclude);

  tickers = tickers.filter(ticker => !excludeSet.has(ticker.substr(0, ticker.indexOf("/"))));

(是否起作用取决于您的确切规则)

答案 1 :(得分:1)

如果“来自API作为对象”表示您确实获得了

{'BTC/USDT': …, 'ETH/BTC': …, 'CELR/BTC': …, …}

不是您在问题中显示的内容,

['BTC/USDT', 'ETH/BTC', 'CELR/BTC', …]

然后deleteObject.keys很好,尽管您可以:

  • 不应将map用于副作用(尤其是不能仅用于副作用)– forEach兼容

  • 不应使用for…in循环来迭代exclude

  • 之类的数组

由于您使用的是let / const,因此很有可能for…ofObject.entries可用:

for (const [key, value] of Object.entries(tickers)) {
    for (const base of exclude) {
        if (key.includes(base)) {
            delete tickers[key]
            break
        }
    }
}

然后,如果您要用不需要花费时间与排除列表大小成比例的东西替换内部循环,并且您似乎能够提取候选列表以通过以下方式从密钥中进行检查:在/上分割,您可以使用其他答案中所述的集合。

答案 2 :(得分:0)

您要求有效,因此您应该查看Set,该查询提供def foo(objs, res): res = [] print(f'{current_process().name} started.') for i in tqdm(objs): res.append(i * 2) print(f'{current_process().name} done.') procs = [] res_1, res_2, res_3 = [], [], [] proc_1 = Process(target=foo, args=(test_1, res_1,)) procs.append(proc_1) proc_1.start() proc_2 = Process(target=foo, args=(test_2, res_2,)) procs.append(proc_2) proc_2.start() proc_3 = Process(target=foo, args=(test_3, res_3,)) procs.append(proc_3) proc_3.start() for proc in procs: proc.join() 的查找时间。

以下程序将排除任何一种货币与排除值匹配的任何股票行情。例如,排除O(1)将删除下面的CELRCELR/BTC-

FOO/CELR

答案 3 :(得分:0)

let   tickers = ['BTC/USDT','ETH/BTC','CELR/BTC',....];
const exclude = ['MATIC', 'CELR'];

要简化功能,可以使用every()indexOf()方法

tickers = tickers.filter((ticker, i) => exclude.every((v) =>  ticker.indexOf(v) == -1));

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)

  

'every'方法一次执行提供的回调函数   数组中的每个元素,直到找到其中一个回调   返回一个伪造的值(当转换为   布尔值)。如果找到了这样的元素,那么every方法会立即   返回false。否则,如果callback为所有回调返回true值   元素,每个都会返回true。回调仅针对索引调用   具有分配值的数组的;它不为索引调用   (Taken from here