迭代嵌套的对象数组并获取结果作为对象数组[关闭]

问题描述 投票:0回答:1

我遇到了一个问题,我真的需要一些关于解决方案的指导。 我有一个如下所示的对象

{
  "count": 3,
  "tree": [
    {
      "name": "Parent1a",
      "children": [
        {
          "name": "Child1a",
          "children": [
            {
              "name": "Child2a",
              "children": [
                {
                  "name": "Child3a",
                  "children": [
                    {
                      "name": "Child4a",
                      "children": []
                    }
                  ]
                }
              ]
            }
          ]
        }
    ]
    },
    {
      "name": "Parent1b",
      "children": [
        {
          "name": "Child1b",
          "children": []
        }
      ]
    }
  ]
}

正如您在上面的对象中看到的,

tree
是一个对象数组。上面的
tree
由 2 个名为
Parent1a
Parent1b
的对象组成。这些对象中的每一个都会有
children
,它也将是对象数组,并且每个
children
对象将进一步具有
children
对象数组,并且它可以在每个对象中继续 n 次。

我们希望从所有这些父对象和所有名为

name
的嵌套对象数组中获取所有
children
属性,然后将这些值放入新的对象数组中。

最终输出应该如下所示。

[
  {
    "id": "Parent1a",
    "label": "Parent1a",
    "level": 0,
  },
  {
    "id": "Child1a",
    "label": "Child1a",
    "parentId": "Parent1a",
    "level": 1,
  },
  {
    "id": "Child2a",
    "label": "Child2a",
    "parentId": "Child1a",
    "level": 2,
  },
  {
    "id": "Child3a",
    "label": "Child3a",
    "parentId": "Child2a",
    "level": 3,
  },
  {
    "id": "Child4a",
    "label": "Child4a",
    "parentId": "Child3a",
    "level": 4,
  },
  {
    "id": "Parent1b",
    "label": "Parent1b",
    "level": 0,
  },
  {
    "id": "Child1b",
    "label": "Child1b",
    "parentId": "Parent1b",
    "level": 1,
  },
  
]

正如您在上面的输出中看到的,

Parent1a
Parent1b
是第一级。即这些是对象的顶级数组,因此
level
被分配给这些对象。当我们深入挖掘树时,每个子对象都会被分配到下一个级别 1、2、3,依此类推,当我们深入挖掘
children
对象数组时。类似地,每个
children
对象数组都分配有一个
id
,这是其父树的
name
。因此,
Child1a
被指定为
Parent1a
作为其parentId。

有人可以让我知道如何实现这一点,因为我真的不擅长递归,并且我查看了一些 stackoverflow 帖子,但感觉与我想要实现的略有不同。 例如动态嵌套对象数组的递归迭代

javascript arrays json loops object
1个回答
1
投票

以下将有助于达到预期的结果

  const convertTree = (input) => {
  const result = []

  const traverse = (node, parentId = null, level = 0) => {
    const { name, children } = node
    const item = {
      id: name,
      label: name,
      level: level,
    }
    if (parentId) {
      item.parentId = parentId
    }
    result.push(item)

    children.forEach((child) => traverse(child, name, level + 1))
  }

  input.tree.forEach((rootNode) => traverse(rootNode))
  return result
}

// Example usage:
const input = {
  count: 3,
  tree: [
    {
      name: "Parent1a",
      children: [
        {
          name: "Child1a",
          children: [
            {
              name: "Child2a",
              children: [
                {
                  name: "Child3a",
                  children: [
                    {
                      name: "Child4a",
                      children: [],
                    },
                  ],
                },
              ],
            },
          ],
        },
      ],
    },
    {
      name: "Parent1b",
      children: [
        {
          name: "Child1b",
          children: [],
        },
      ],
    },
  ],
}

const output = convertTree(input)
console.log(output)
© www.soinside.com 2019 - 2024. All rights reserved.