是否可以在不超出调用堆栈的情况下展平 700 000 个条目长的数组?

tim*_*gfx 6 javascript arrays callstack

我正在尝试展平一个由 100 000 个项目组成的巨大数组,我将其展平两次,因为它是二维的,我想获取第二个数组内的所有对象: [ [ {} ] ]

我尝试过使用reduce和concat,如下所示:

连接。firstFlat 会在一秒内处理完毕。SecondFlat 会导致超出最大调用堆栈。

let firstArray = Array(100000).fill(Array(7).fill({}));
let firstFlat = [].concat.apply([], firstArray);
let secondFlat = [].concat.apply([], firstFlat);
Run Code Online (Sandbox Code Playgroud)

减少。调用栈也超出了

let array = Array(100000).fill(Array(7).fill({}))
                         .reduce((x, y) => x.concat(y))
                         .reduce((x, y) => x.concat(y))
                         .reduce((x, y) => x.concat(y));
Run Code Online (Sandbox Code Playgroud)

我想不出解决方案,可能是因为我不太了解调用堆栈到底是什么。我知道它是当前正在执行的所有函数的“堆栈”。但reduce不应该只有1个函数吗?并且里面的匿名函数执行一次,然后匿名函数与其他参数一起使用。所以调用堆栈上应该有1个reduce函数和1个匿名函数。那么如何超出调用堆栈呢?我能想到的唯一原因是reduce是一个函数循环,我不知道如何调用它,但就像我的意思是这样的:function a() { a() },它可能就是这样。在这种情况下,我最好使用 forEach/for。但是为什么第一个方法超出了调用堆栈呢?Concat 也只是一个函数,对吗?我很困惑。

我真的很感激一些帮助!提前致谢

编辑:Object.assign 似乎也发生同样的问题。所有这些函数都依赖于函数循环。我认为应该更新,所以他们使用异步等待,这样调用堆栈就不会填满

Mat*_*bin 1

建议您使用扩展运算符。更加强大”。

let firstArray = Array(100000).fill(Array(7).fill({}));
Array.prototype.concat(...firstArray) // (700000) [...]
Run Code Online (Sandbox Code Playgroud)

第一个展平步骤是使用展开运算符。

“翻译”展开运算符后,它会执行以下操作:

Array.prototype.concat(firstArray[0], firstArray[1], ..., firstArray[699999]);
Run Code Online (Sandbox Code Playgroud)

这是扁平化的第二个层次。