我正在尝试展平一个由 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 似乎也发生同样的问题。所有这些函数都依赖于函数循环。我认为应该更新,所以他们使用异步等待,这样调用堆栈就不会填满
根据ESLint,这样的一些代码不是'干净的代码'
for(;;) {
await *async function*
}
Run Code Online (Sandbox Code Playgroud)
我的目标是无限循环某个函数,逐个执行它,而不会因为调用堆栈限制而最终崩溃我的应用程序.我已经考虑了一段时间但是却无法提出其他任何可以做同样事情的事情.ESLint的建议也不适用于我的情况; 他们建议启动循环中的所有函数,并使用.all()等待它们在循环外的解析/拒绝回调.
帮助将不胜感激!我只想尽可能干净地写出来