
本文介绍如何使用 lodash(或原生 javascript)将多维嵌套结构中每个对象的 `nodes` 属性提取为独立数组,实现从 `[[{nodes: [...]}, ...], [...]]` 到 `[[[...], [...]], [[...], ...]]` 的精准转换。
在处理 GraphQL 响应时,常遇到深层嵌套的数据结构。如题所示,原始数据是一个二维数组,其每一项是包含 nodes 字段的对象数组;而目标结构要求:保留外层数组维度,但将内层每个对象的 nodes 数组直接“提升”出来,替代原对象本身。
此时,flatMap 并不适用——因为它会扁平化层级(例如 flatMap('ciVariables.nodes') 会导致所有 nodes 被合并到同一级),而我们需要的是结构对齐的映射转换(map-in-map)。
✅ 正确解法是使用 双重 map:
- 外层 map 遍历最外层数组(即每个子数组);
- 内层 map 遍历该子数组中的每个对象,提取其 nodes 属性。
const result = _.chain(resp.data.data.projects.nodes) .map(subArray => _.map(subArray, 'nodes')) // 或写为 subArray.map(obj => obj.nodes) .value();
? 提示:_.map(collection, 'path') 是 Lodash 的便捷语法,等价于 _.map(collection, item => _.get(item, 'path')),安全支持嵌套路径(如 'ciVariables.nodes'),但本例中路径固定为顶层 nodes,直接使用字符串 'nodes' 即可。
如果你希望进一步链式化并兼容潜在空值,可增强健壮性:
const result = _.chain(resp.data?.data?.projects?.nodes)
.filter(_.isArray) // 确保外层每个元素是数组
.map(subArray =>
_.map(subArray, item => _.isArray(item?.nodes) ? item.nodes : [])
)
.value();? 总结:
- ❌ 避免 flatMap —— 它破坏原有二维结构;
- ✅ 优先用 map → map 保持层级对齐;
- ✅ 利用 _.map(arr, 'nodes') 简洁提取属性,语义清晰且可读性强;
- ? 生产环境建议添加空值检查(如 ?.nodes 或 _.get(item, 'nodes', [])),防止运行时错误。
该模式适用于任何“数组套对象,对象含同名数组字段”的标准化提取场景,是 GraphQL + Lodash 数据规整的经典实践。










