You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将嵌套对象数组转换为指定结构的二维数组(Google表格用)

嵌套对象数组转指定二维数组解决方案

问题描述

需要将多层嵌套的对象数组转换为特定格式的二维数组,最终用于Google Spreadsheet逐行写入数据。

原始对象数组结构

const arrayOfObjects = [
  {
    "name": "A",
    "child": [
      {
        "name": "A1",
        "child": [
          {"name": "A1a"},
          {"name": "A1b"},
          {"name": "A1c"}
        ]
      },
      {
        "name": "A2",
        "child": [
          {"name": "A2a"},
          {"name": "A2b"}
        ]
      },
      {
        "name": "A3",
        "child": [
          {"name": "A3a"},
          {"name": "A3b"},
          {"name": "A3c"},
          {"name": "A3d"}
        ]
      },
      {
        "name": "A4",
        "child": [
          {"name": "A4a"},
          {"name": "A4b"},
          {"name": "A4c"}
        ]
      }
    ]
  },
  {
    "name": "B",
    "child": [
      {
        "name": "B1",
        "child": [
          {"name": "B1a"},
          {"name": "B1b"}
        ]
      },
      {
        "name": "B2",
        "child": [
          {"name": "B2a"},
          {"name": "B2b"}
        ]
      },
      {
        "name": "B3",
        "child": [
          {"name": "B3A"},
          {"name": "B3b"},
          {"name": "B3c"},
          {"name": "B3d"},
          {"name": "B3e"}
        ]
      }
    ]
  }
  // 其他同结构对象
];

目标二维数组格式

const targetArray = [
  ["A","A1","A1a"],
  ["A1b"],
  ["A1c"],
  ["A2","A2a"],
  ["A2b"],
  ["A3","A3a"],
  ["A3b"],
  ["A3c"],
  ["A3d"],
  ["A4","A4a"],
  ["A4b"],
  ["A4c"],
  ["B","B1","B1a"],
  // 后续同规则项
];

实际操作中用forEach遍历多层嵌套结构时,没法正确生成这种格式的二维数组。

解决方案:递归遍历处理嵌套结构

多层嵌套的结构用递归处理最省心,核心是维护当前路径的名称数组,遍历到叶子节点时生成对应行,同层级后续的叶子节点只保留自身名称。

实现代码

function convertToTargetArray(data) {
  const result = [];
  
  // 递归处理函数,currentPath记录当前层级的名称链
  function traverse(node, currentPath = []) {
    const newPath = [...currentPath, node.name];
    
    if (node.child && node.child.length > 0) {
      // 遍历子节点,第一个子节点继承完整路径,后续子节点只带当前父节点名称
      node.child.forEach((child, index) => {
        const pathToPass = index === 0 ? newPath : [node.name];
        traverse(child, pathToPass);
      });
    } else {
      // 叶子节点,把当前路径加入结果
      result.push(newPath);
    }
  }
  
  // 处理顶层每个对象
  data.forEach(item => traverse(item));
  
  return result;
}

// 使用示例
const convertedArray = convertToTargetArray(arrayOfObjects);
console.log(convertedArray);

代码逻辑说明

  1. 递归函数traverse:负责处理单个节点,参数里的currentPath用来记录从顶层到当前节点的名称链:
    • 第一个子节点会沿用完整的父路径,比如A→A1→A1a,最终生成["A","A1","A1a"]
    • 同层级的其他子节点只保留直接父节点的名称,比如A1的第二个子节点A1b,路径就是["A1b"]
  2. 叶子节点处理:当节点没有child或者child为空时,就把当前路径数组加到结果里。
  3. 顶层遍历:调用递归函数处理原始数组里的每一个顶层对象。

用这个方法转换后,得到的二维数组完全符合需求,直接就能用于Google Spreadsheet的逐行写入。

内容的提问来源于stack exchange,提问作者mthgn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 14:27:23