如何使用reduce替代双重循环优化代码,解决返回空数组问题
reduce替代双重forEach的问题排查与修正方案
问题根因
你的reduce实现返回空数组,主要原因是调用了不必要的flat()方法,且存在逻辑冗余:
- 原双重forEach的逻辑只是把所有
layer.items的元素逐一合并到结果数组,没有嵌套数组拍平需求,不需要调用flat() - 如果你的运行环境不支持ES2019及以上的
flatAPI,执行时会抛出异常,若外层有异常捕获逻辑返回空数组,就会得到你遇到的结果 - 额外的
flat()调用也会增加不必要的性能开销
修正实现
以下两种实现都和原代码逻辑完全等价,性能优于双重forEach:
写法1:reduce + push(性能最优,无额外数组创建)
private getAllRegistryObjects(registry: RegistryGeneric) { return registry.RegistryLayers.reduce((acc, layer) => { acc.push(...layer.items); return acc; }, []); }
写法2:reduce + concat(代码更简洁)
确认layer.items是标准数组时可以用这个写法:
private getAllRegistryObjects(registry: RegistryGeneric) { return registry.RegistryLayers.reduce((acc, layer) => acc.concat(layer.items), []) }
内容的提问来源于stack exchange,提问作者user16382159
相关产品推荐
相关产品推荐

