如果没有发电机,如何解决以下问题?我在一个正在研究的项目中遇到了类似这样的事情,需要成对进行深度迭代。我只能用发电机解决它。
nums
是一个示例输入。输入是一个任意长度的数组,由整数和任意深度的其他数组组成。
在[beforeNum,nextNum]对中迭代nums
。这意味着
第一对的第一个值应为null
([null, 1]
)。第二
对应该是[1, 2]
,依此类推。最后一对应该是[10, 11]
。
最终,我的实际目标是能够获得第n个人"原子",无论它有多少层次。例如,get(nums, 6)
将为7。
const nums = [1, [2, 3, [4, [5, 6], 7], [8, 9, [10], 11]]];
编辑使用@ hugomg的帮助计算出来。当我进去的时候,事实证明,我实际上用一些与普通数组不同的东西来实现它的事实正在阻碍我。该解决方案实际上非常简单:https://gist.github.com/jclem/fbd44c43cb175dbf880e
答案 0 :(得分:1)
我们可以通过在树上进行简单的遍历来解决您的问题,因为我们继续保持“prev”变量。它只是写一个简单的递归问题:
function iterate(tree, onNum){
var prev = null;
function go(x, onNum){
if(x instanceof Array){
// If you are using a library that provides
// an isArray function it can be more accurate than this.
for(var i=0; i<x.length; i++){
go(x[i], onNum);
}
}else{
onNum(prev, x);
prev = x;
}
}
go(tree, onNum);
}
var myTree = [1, [2, 3, [4, [5, 6], 7], [8, 9, [10], 11]]];
iterate(myTree, function(prev, curr){
console.log(prev, curr);
});
这里不需要使用发电机。如果您需要将迭代器设置为可以“暂停”的外部迭代器,则生成器仅提供帮助。例如,如果您需要并行迭代这些树中的两个。对于使用内部迭代器的当前问题,一些递归很好。