首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环遍历嵌套的JSON子对象

循环遍历嵌套的JSON子对象
EN

Stack Overflow用户
提问于 2020-02-06 16:38:22
回答 3查看 1.1K关注 0票数 2

我有这个JSON有效负载,其中每个对象都包含一个ID、名称和子对象数组。在这里,我需要获取所有元素的ID,包括根元素和所有嵌套子元素。

代码语言:javascript
复制
{
  "_id": "-1",
  "_name": "root",
  "_children": [
    {
      "_id": "1",
      "_name": "Child 1",
      "_children": [
        {
          "_id": "1-1",
          "_name": "Child 1-1",
          "_children": [
            {
              "_id": "1-1-1",
              "_name": "Child 1-1-1",
              "_children": [

              ]
            }
          ]
        },
        {
          "_id": "1-2",
          "_name": "Child 1-2",
          "_children": [

          ]
        },
        {
          "_id": "1-3",
          "_name": "Child 1-3",
          "_children": [

          ]
        }
      ]
    },
    {
      "_id": "2",
      "_name": "Child 2",
      "_children": [
        {
          "_id": "2-2",
          "_name": "Child 2-2",
          "_children": [

          ]
        }
      ]
    }
  ]
}

我如何遍历它来获得所有子节点和根节点的ID值?

这就是我尝试使用嵌套函数的方法,但它不起作用。

代码语言:javascript
复制
getNestedChildren(arr) {
  var out = []
    for(var i in arr[0].children) {
      out.push(arr[i].id);
        if(arr[i].children && arr[i].children.size() > 0) {
            var children = this.getNestedChildren(arr[i].children)
        }
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-02-09 12:00:23

您可以使用递归,并通过引用修改“结果数组”。

例如,如果嵌套对象存储在变量data中,则:

代码语言:javascript
复制
function addNestedChildrenToArray(obj, resultArray) {
    resultArray.push(obj._id);
    obj._children.forEach(child => addNestedChildrenToArray(child, resultArray));
}

const resultArray = [];
addNestedChildrenToArray(data, resultArray);
// resultArray now contains the results
console.log(resultArray);

You can test it here: https://es6console.com/k6ehwu5p/

票数 4
EN

Stack Overflow用户

发布于 2020-02-06 19:08:19

您可以展平一棵树,然后简单地获取ids。请参阅工作示例here

代码语言:javascript
复制
const tree = {
  "_id": "-1",
  "_name": "root",
  "_children": [
    // ...
  ]
}

function flattenTree(tree) {
  if (!tree) {
      return [];
  }

  if (tree._children) {
      const result = tree._children.reduce((prev, current) => prev.concat(flattenTree(current)), [tree]);
      return result;
  } else {
      return [tree];
  }
}

const plain = flattenTree(tree);
const ids = plain.map(value => value._id);
票数 1
EN

Stack Overflow用户

发布于 2020-02-09 12:16:47

这里有一个解决方案,其工作方式基本上与@samdouble的答案相同;将当前节点的ID推送到一个结果数组中,然后递归到该节点的子节点上。

结果数组必须在调用递归函数之前创建,因此为方便起见,可以将其包装在外部函数中;这使得调用者不必创建一个空数组来传递给函数。

代码语言:javascript
复制
interface TreeNode {
    _id: string;
    _name: string;
    _children: TreeNode[];
}

function getIds(data: TreeNode): string[] {
    const result: string[] = [];
    function helper(node: TreeNode): void {
        result.push(node._id);
        node._children.forEach(helper);
    }
    helper(data);
    return result;
}

Playground Link

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60090730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档