如何在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
相关产品推荐
相关产品推荐

