TypeScript中如何用Lodash拍平(IRobotics | IRobotics[][])[]嵌套数组
固定两层嵌套数组的完全拍平实现
问题根因
使用_.flatMap()后仍残留嵌套结构的核心原因是:flatMap仅会对数组做 1层深度的解包。
结合当前values的类型(IRobotics | IRobotics[][])[]的结构特点:
- 数组元素可能是单个
IRobotics对象,也可能是两层嵌套的IRobotics[][]结构 - 经过1层flatMap解包后,原来的
IRobotics[][]会被拆为一层IRobotics[]留在结果中,由于没有第二层级的解包逻辑,最终结果就会残留这一层嵌套
可落地的实现方案
方案1:基于现有Lodash依赖实现
直接使用Lodash的_.flattenDepth()方法,通过指定拍平深度,精准匹配当前的两层嵌套场景,不会出现过度拍平的问题:
// 替代原代码中的_.flatMap逻辑 const parsedValues = _.flattenDepth(values, 2) as IRobotics[];
这个实现的拍平逻辑和当前结构完全匹配:
- 最外层数组解一层,把
IRobotics[][]结构拆为IRobotics[] - 第二层解包,把残留的
IRobotics[]拆为单个IRobotics对象 - 最终得到完全一维的
IRobotics列表
修改后的完整处理函数如下:
static createFromeData(item: EveryMatrix) { const values = Object.entries(item).map(entry => { return this.createFromEntry(entry); }); const parsedValues = _.flattenDepth(values, 2) as IRobotics[]; const roboticsInstance = new IRoboticsEveryMatrix(parsedValues); return roboticsInstance; }
方案2:原生JS实现,无额外依赖
如果不想依赖Lodash,可以直接使用原生Array.prototype.flat方法,参数逻辑和Lodash的flattenDepth完全一致:
const parsedValues = values.flat(2) as IRobotics[];
优化建议
- 不推荐使用
_.flattenDeep()或者flat(Infinity)这类无限深度拍平的方法,一旦后续业务结构调整出现更深层级的嵌套,很容易误拆本该保留的业务结构,固定深度2和当前的类型定义完全匹配,可控性更强 - 原代码中定义的
nestedValues变量当前未被使用,如果没有后续的分支处理逻辑,可以删除这行冗余代码 - 原代码中实例化变量命名为
IRobotics和自定义接口同名,容易造成作用域混淆,建议调整为语义化的变量名,减少后续维护的歧义 - 后续可以通过TS类型工具替代直接的
as强转,让TS自动推导拍平后的结果类型,减少强转带来的运行时风险
内容的提问来源于stack exchange,提问作者Kristoffer Tølbøll
相关产品推荐
相关产品推荐

