Javascript 以特定方式解析嵌套对象数组

Javascript 以特定方式解析嵌套对象数组,javascript,arrays,object,Javascript,Arrays,Object,我有一个对象数组,可以将其他对象数组作为子对象(它可以有一个复杂的层次结构):如果一个对象有一个childrenprop-它是一个组,如果它没有-它是一个项: var myData = [ { "name": "item 1" }, { "name": "group 1", "children": [ { "name": "item in a group 1" }] }, { "nam

我有一个对象数组,可以将其他对象数组作为子对象(它可以有一个复杂的层次结构):如果一个对象有一个
children
prop-它是一个组,如果它没有-它是一个项:

var myData = [
  {
      "name": "item 1"
  },
  {
      "name": "group 1",
      "children": [
      {
          "name": "item in a group 1"
      }]
  },
  {
      "name": "group 2",
      "children": [
      {
          "name": "group 1 in a group 2",
          "children": [
          {
              "name": "item in a nested group 1"
          },
          {
              "name": "deeply nested group",
              "children": [
              {
                  "name": "deep item"
              }]
          },]
      },
      {
          "name": "group 2 in a group 2",
          "children": [
          {
              "name": "item in a nested group 2"
          }]
      }]
  }]
我想对它进行解析,得到一个平面对象,它将所有组作为道具,项目作为数组,每个道具还将包括来自孙子组的项目

目前,通过下面的代码,我可以将阵列展平,并将组作为道具,将项目作为每个对象的阵列:

{
    "root": [
        "item 1"
    ],
    "group 1": [
        "item in a group 1"
    ],
    "group 2": [],
    "group 1 in a group 2": [
        "item in a nested group 1"
    ],
    "deeply nested group": [
        "deep item"
    ],
    "group 2 in a group 2": [
        "item in a nested group 2"
    ]
}
然而,我正在努力增加孙辈。以下是所需的输出:

{
    "root": [
        "item 1"
    ],
    "group 1": [
        "item in a group 1"
    ],
    "group 2": [
        "item in a nested group 1", // includes items of child groups
        "item in a nested group 2",
        "deep item"
    ],
    "group 1 in a group 2": [
        "item in a nested group 1",
        "deep item" // includes item of a child group
    ],
    "deeply nested group": [
        "deep item"
    ],
    "group 2 in a group 2": [
        "item in a nested group 2"
    ]
}
以下是我正在使用的代码(我只能使用较旧版本的纯JS,因此没有ES6、NPM;但可以使用polyfill)

var myItems={
“根”:[]
}
var i;
对于(i=0;i
我不明白我如何才能制作一个版本的代码(或者更好的版本?),用孙辈的项目填充父组。

古老的版本

函数平面(阵列、父级、目标){
varⅠ,j;
父母=父母| |[];
target=target | |{root:[]};
对于(i=0;i

.as console wrapper{max height:100%!important;top:0;}
您的对象是否有ID?为什么在
“root”
中没有
“group1”
?@NinaScholz我保留
root
用于数组顶层但不是组的项目(如
项目1
)好的。这是可能的,但稍后您必须循环对象的所有属性,并找出哪些属性位于根目录下。如果您包含根目录下的所有子目录,您将获得干净的父子关系。感谢您的回复,Nina!正如我提到的,很遗憾,我无法使用像
这样的现代JS功能。是否可以更新您的信息r用更古老的答案回答?:)谢谢你的更新和你的时间。但是结果与我的目标不同:你的脚本将孙子的名字放入数组中,我需要项目名称,另外我认为你的脚本在一个嵌套级别上工作,
myData
可以有更多的嵌套组。基本上最顶层的组包括e自身的项和所有子项,嵌套组将包括自身的项和其子项等。我更新了输入数据以获得更精确的条件,并尽我所能以明确的方式询问它是否适用于深层嵌套数据结构,因为它具有递归性。请参阅编辑。下面是当前输出和子项的比较预期输出:我不理解想要的结果。它违反了(我的)规则,一个子一父。
“嵌套组2中的项”有两个父项。
var myItems = {
    'root': []
}
var i;

for (i = 0; i < myData.length; i++)
{
    parseItems(myData[i], 'root')
}

function parseItems(data, groupName)
{
    var key, i;
    for (key in data)
    {
        if (!data.hasOwnProperty(key))
          continue;
        else if (data.hasOwnProperty('children'))
        {
            groupName = data['name']
            if (myItems[groupName] == undefined) myItems[groupName] = []
            for (i = 0; i < data[key].length; i++)
            {
                parseItems(data[key][i], groupName);
            }
        }
        else
        {
            myItems[groupName].push(data['name']);
        }
    }
}