Lodash 中使用双层 map 提取嵌套对象的 nodes 数组

14次阅读

Lodash 中使用双层 map 提取嵌套对象的 nodes 数组

本文介绍如何使用 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 数据规整的经典实践。

text=ZqhQzanResources