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

如何在TypeScript/JavaScript中提取多层嵌套JSON的所有ID?

提取嵌套树形结构中所有层级的ID

要从这种嵌套的组织层级JSON里提取所有ID,不管层级深度,确实可以用递归或者**非递归(迭代)**的方法来实现。先看看你现有代码里的几个小问题:

  • arrayOfids没有初始化,应该先设为[]
  • 循环里错误使用了arr[i],应该是arr[j]
  • 递归调用时传的是整个arr数组,而不是当前节点的children
  • 最外层的data是单个对象,不是数组,你的parsejson函数里循环data.length会出错

下面是两种可行的实现方式:

方法一:递归实现

递归是处理树形结构最直观的方式,逻辑很简单:遍历每个节点,先收集当前节点的ID,再递归处理它的所有子节点。

// 假设我们已经拿到了responseBody里的data对象
const rootNode = responseBody.data;
const allIds = [];

function collectIds(node) {
  // 先把当前节点的ID加入数组
  allIds.push(node.id);
  // 如果有子节点,递归处理每个子节点
  if (node.children && node.children.length > 0) {
    node.children.forEach(child => collectIds(child));
  }
}

// 启动递归
collectIds(rootNode);
console.log(allIds); // 输出所有层级的ID数组:["2", "54", "56", "51", "66", "5", "74", ...]

方法二:非递归(迭代)实现

如果担心递归深度过大导致栈溢出(比如层级特别深的结构),可以用迭代的方式,借助栈或者队列来遍历所有节点:

深度优先遍历(用栈)

const rootNode = responseBody.data;
const allIds = [];
const stack = [rootNode];

while (stack.length > 0) {
  const currentNode = stack.pop();
  // 收集当前节点ID
  allIds.push(currentNode.id);
  // 把子节点倒序压入栈,保证遍历顺序和递归一致(可选,顺序不影响ID收集)
  if (currentNode.children && currentNode.children.length > 0) {
    // 倒序是因为栈是后进先出,这样能保持和递归一样的从上到下顺序
    for (let i = currentNode.children.length - 1; i >= 0; i--) {
      stack.push(currentNode.children[i]);
    }
  }
}

console.log(allIds);

广度优先遍历(用队列)

如果想按层级顺序收集ID(从根到叶子,一层一层来),可以用队列:

const rootNode = responseBody.data;
const allIds = [];
const queue = [rootNode];

while (queue.length > 0) {
  const currentNode = queue.shift();
  allIds.push(currentNode.id);
  if (currentNode.children && currentNode.children.length > 0) {
    queue.push(...currentNode.children);
  }
}

console.log(allIds);

这两种方法都能正确收集所有层级的ID,你可以根据自己的场景选择:递归写法简洁易读,迭代写法更适合超深层级的结构避免栈溢出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 10:52:46