[英]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
函数,如reduce
、 map
、 filter
等在每一步都执行完整复制)。
另一种方法是编写生成器 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.