繁体   English   中英

Javascript 中的嵌套循环快捷方式?

[英]Nested loops shortcut in Javascript?

在我正在编写的程序中,我有一个多维数组,我只需要对最内部的对象执行一些操作。

有没有更好的方法来编写这段代码?

for (const threeDimensionalArray of fourDimensionalArray) {
  for (const twoDimensionalArray of threeDimensionalArray) {
    for (const oneDimensionalArray of twoDimensionalArray) {
      for (const obj of oneDimensionalArray) {
        // do something
      }
    }
  }
}

就像是:

for (const obj someSpecialKeyword fourDimensionalArray) {
  // do something
}

注意:我知道一种使用扁平 function 的解决方案。 使用扁平化 function 的问题在于,此迭代将在程序中大量使用,因此我担心性能。 即使我以两种格式保存这个多维数组(一种是平面数组,另一种是多维数组),它也会导致性能问题,因为这个数组也发生了很大的变化并且也使代码更长。

这里最好的方法是什么?

我知道一种使用扁平化 function 的解决方案

我假设“扁平化功能”是指减速器 function? (不幸的是,JavaScript 的Array.prototype函数,如reducemapfilter等在每一步都执行完整复制)。

另一种方法是编写生成器 Function(又名迭代器函数)

function* getAll( fourDimensionalArray ) { // The asterisk is not a typo.
    for (const threeDimensionalArray of fourDimensionalArray) {
        for (const twoDimensionalArray of threeDimensionalArray) {
            for (const oneDimensionalArray of twoDimensionalArray) {
                for (const obj of oneDimensionalArray) {
                    yield obj;
                }
            }
        }
    }
}

像这样使用:

for( const item of getAll( fourDimensionalArray ) ) {
    // do something
}

生成器函数非常高效,不会导致数组复制操作。

您可以采用递归 function,它采用数组或项目以及非 arrays 的回调。

这个function不依赖固定结构。

function iter(value, cb) {
    if (Array.isArray(value)) {
        for (const item of value) iter(item, cb);
    } else {
        cb(value);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM