如何高效处理嵌套字段可能为单对象或数组的JavaScript动态结构对象
最优解决方案:统一格式预处理
核心思路是封装通用工具函数,把所有可能返回单个对象/数组的字段统一转为数组格式,后续业务逻辑完全不需要再做类型判断,直接按数组处理即可。
1. 封装通用转换函数
// 入参可以是任意类型,返回统一格式的数组 const toArray = (val) => { if (val === undefined || val === null) return [] return Array.isArray(val) ? val : [val] }
2. 预处理接口返回数据
拿到响应后先做一次格式统一,后续所有逻辑直接用处理后的数组:
// 统一转换运单列表,不管原返回是单个对象还是数组 const shipments = toArray(pyLd.TrackResponse?.Shipment) // 直接获取运单总数,不需要判断类型 const shipmentCount = shipments.length // 统计所有包裹总数,不需要嵌套if判断 const packageCount = shipments.reduce((total, shipment) => { return total + toArray(shipment.Package).length }, 0) // 如需获取所有包裹的活动记录,也可以直接扁平化处理 const allActivities = shipments.flatMap(shipment => { return toArray(shipment.Package).flatMap(pkg => toArray(pkg.Activity)) })
3. 替换原有冗余逻辑
原来的multiPackage函数可以直接简化为以下几行:
const getShipmentInfo = () => { const shipments = toArray(pyLd.TrackResponse?.Shipment) const totalPackages = shipments.reduce((sum, ship) => sum + toArray(ship.Package).length, 0) return { shipments: shipments.length, packages: totalPackages } }
方案优势
- 完全消除嵌套if判断,代码量减少70%以上
- 扩展性极强,后续新增需要判断的嵌套字段,只需要调用
toArray转换即可 - 异常兼容性好,字段为空时直接返回空数组,不会出现读取length报错的问题
- 如果是项目中大量接口存在该问题,可以直接在请求响应拦截器中对指定字段做统一转换,业务代码完全不需要感知兼容逻辑
内容的提问来源于stack exchange,提问作者Everything Digital
相关产品推荐
相关产品推荐

