Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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 如何在没有递归的情况下迭代n级深度的数组?_Javascript_Arrays_Iteration - Fatal编程技术网

Javascript 如何在没有递归的情况下迭代n级深度的数组?

Javascript 如何在没有递归的情况下迭代n级深度的数组?,javascript,arrays,iteration,Javascript,Arrays,Iteration,我有点像: [ {}, {children:[{}, {}]} , {} ] #each element cane be any level deep 并希望在不递归的情况下对其进行迭代。只是为了测试性能优势。有什么帮助吗?我可能错了,但是如果你能检查数组中是否有以下元素,你能写一个嵌套的while循环吗?每个复活函数都可以被简化成一个函数,保留自己的堆栈-问题是:它更快吗?我想不是 我这里的意思是(在伪代码中) 调用flatte(您的输入对象)将产生一个“天真的类人枚举”列表,列出它的条目

我有点像:

[ {}, {children:[{}, {}]} , {} ]  #each element cane be any level deep

并希望在不递归的情况下对其进行迭代。只是为了测试性能优势。有什么帮助吗?

我可能错了,但是如果你能检查数组中是否有以下元素,你能写一个嵌套的while循环吗?

每个复活函数都可以被简化成一个函数,保留自己的堆栈-问题是:它更快吗?我想不是

我这里的意思是(在伪代码中)


调用
flatte(您的输入对象)
将产生一个“天真的类人枚举”列表,列出它的条目

哦,不,我认为没有递归是不可能的。但真正的问题是:为什么不使用递归就可以做到这一点?我使用递归实现,它工作得很好,但经理建议通过迭代实现,因为它可能更快。所以试着描述一下这两个,看看。这可能适用于大型数据集,因此可能存在显著差异。我不完全确定这一点,但我不认为您可以通过迭代实现这一点,因为如果您编写n个深度的迭代,并且得到一个深度为n+1的对象,那么您的函数将无法很好地工作(它将使最后一级未解析)。对你的经理说:p这是递归速度更快的例子之一。而且听起来你的经理试图过早地优化。很酷,是的,在这种情况下,我们先展平然后迭代,而在递归中,我们边走边迭代。我想递归可能会更快
function flatten(something) {
  var ping=[];
  var pong=[];
  repeat {
    if (ping is empty) {
      if (something is empty) break;
      else ping.prepend(something.shift());
    }

    var element=ping.shift();
    if (element has children)
      foreach (child of element in reverse order) ping.prepend(child);
    else
      pong.append(element);
  }

  return pong;
}