
本文介绍如何使用 JavaScript 的 flatMap() 链式操作,高效提取深层嵌套结构(如 consignments → shipping/downloads → line_items)中所有 sku 字段值,并合并为单一扁平数组。
本文介绍如何使用 javascript 的 `flatmap()` 链式操作,高效提取深层嵌套结构(如 `consignments → shipping/downloads → line_items`)中所有 `sku` 字段值,并合并为单一扁平数组。
在实际电商或订单系统开发中,常需从复杂嵌套的 JSON 数据中批量提取特定字段(如商品 SKU)。本例中,目标字段 sku 分布在两个并列路径下:
-
consignments[i].shipping[j].line_items[k].sku -
consignments[i].downloads[l].line_items[m].sku
直接使用多层 for 循环虽可行,但代码冗长、可读性差且难以维护。现代 JavaScript 提供了更优雅的函数式方案:flatMap() + concat() 组合,实现一次遍历、多源聚合。
✅ 推荐解法:链式 flatMap 提取 SKU
const skuArray = jsonObject.consignments.flatMap(consignment =>
// 合并 shipping 和 downloads 两个数组(二者结构一致:均有 line_items)
[...consignment.shipping, ...consignment.downloads]
// 对每个含 line_items 的对象,提取其全部 sku
.flatMap(item =>
item.line_items?.map(lineItem => lineItem.sku) || []
)
);? 关键点说明:
flatMap()先映射再自动扁平化一层,避免嵌套数组(如[["ABS", "OCG"], ["OFSUC"]]→["ABS", "OCG", "OFSUC"]);- 使用扩展运算符
[...shipping, ...downloads]替代concat(),语义更清晰且支持空数组安全;- 添加
?.可选链和|| []防御性处理,避免line_items缺失时抛错(健壮性必备);- 不依赖
filter()或手动push(),全程声明式、无副作用。
? 运行结果验证
对示例数据执行上述逻辑,输出为:
["ABS", "OCG", "OFSUC"]
完全匹配预期结果,且顺序与数据中出现位置一致(先 shipping 内 line_items,后 downloads 内 line_items)。
⚠️ 注意事项
- 若需去重,可在最后追加
.filter((v, i, a) => a.indexOf(v) === i); - 若需按 SKU 分组统计数量,可用
reduce()构建 Map; - 浏览器兼容性:
flatMap()和可选链?.需 ES2019+ 环境(Chrome 69+/Firefox 62+/Safari 12+),旧环境请用 Babel 转译或降级为reduce()+concat()组合; - 建议对原始 JSON 做基础校验(如
jsonObject?.consignments instanceof Array),提升生产环境鲁棒性。
此方法兼顾简洁性、可读性与工程可靠性,是处理多层嵌套数组属性提取的推荐实践。


















