如何递归地遍历具有子数组的对象数组并返回最终转换的对象数组

如何解决如何递归地遍历具有子数组的对象数组并返回最终转换的对象数组

我希望循环一个对象,该对象也可以包含对象数组,对象数组可以包含对象数组,依此类推。理论上,这种结构可能是无限的,但这种方式的深度不太可能超过 12 层。

转换前的数据结构示例:

{
  id: '1234',name: 'item 1',children: [
    {
      id: '2345',name: 'item 2',// other properties that I don't care about will be here too
      children: [
        {
          id: '3456',name: 'item 3',children: [
            {
              id: '4567',name: 'item 4',}
          ],}
      ],}
  ],}

我需要最终数据结构的样子(需要一个认的第一个对象):

const someArray = [
  {
    // this first child is static and will always be here after transform
    title: 'Projects'
    key: 'projects',children: [
      {
        title: 'item 1',// this is 'name' property
        key: '1234,' // this is 'id' property
        children: [
          {
            title: 'item 2',key: '2345',children: [
               // continue as long as there are children arrays
             ]
          }
        ]
      }
    ]
  }
]

我尝试了几种不同的解决方案,我相信递归函数解决方案,但我只是无法弄清楚如何输出最终结构。我得到了最后两个孩子,但我无法累积以前的孩子。

这是我最接近的非工作解决方案:

const startingObj = [ 
  {
    title: 'Projects',key: 'projects',}
]

function buildTree (obj) {
  // check if we have a children array with at least 1 child.
  if (obj?.children?.length) {
    return obj?.children.reduce((a,item) => {
      if (a) return {
        ...item.children,title: a.name || a.title,key: a.id || a.key,};
      if (item?.children?.length) return buildTree(item.children);
    },obj);
  }
}

buildTree(); // would pass in the sample data structure from above here.

我不确定减少是否不是这里的最佳解决方案,或者我只是在我的方法中遗漏了一些关键想法。任何帮助将不胜感激。谢谢。

解决方法

这个怎么样:

// this function recurses down the tree and for each item it makes a
// transformed item (saving only the title and key). Then the transformed
// item is returned and the caller pushes it into the children array
function buildtree(obj) {
  let item = {
    title: obj.name || obj.title,key: obj.id || obj.key,children: []
  }

  if (obj.children)
    for (child of obj.children)
      item.children.push( buildtree(child) )

  return item;
}

let result = [ 
  {
    title: 'Projects',key: 'projects',children: []
  }
]

result[0].children.push( buildtree(obj) )

这是一个完整的可运行示例:

obj = {
  id: '1234',name: 'item 1',x: '',// other properties that I don't care about will be here too
  children: [
    {
      id: '2345',name: 'item 2',// other properties that I don't care about will be here too
      children: [
        {
          id: '3456',name: 'item 3',// other properties that I don't care about will be here too
          children: [
            {
              id: '4567',name: 'item 4',// other properties that I don't care about will be here too
            },{
              id: '5678',name: 'item 5',// other properties that I don't care about will be here too
            }
          ]
        },{
          id: '6789',name: 'item 6',// other properties that I don't care about will be here too
          children: [
            {
              id: '7890',name: 'item 7',{
              id: '890a',name: 'item 8',// other properties that I don't care about will be here too
            }
          ]
        }
      ]
    },{
      id: '90ab',name: 'item 9',// other properties that I don't care about will be here too
      children: [
        {
          id: '0abc',name: 'item 10',// other properties that I don't care about will be here too
          children: [
            {
              id: 'abcd',name: 'item 11',{
              id: 'bcde',name: 'item 12',{
          id: 'cdef',name: 'item 13',// other properties that I don't care about will be here too
          children: [
            {
              id: 'defg',name: 'item 14',{
              id: 'efgh',name: 'item 15',// other properties that I don't care about will be here too
            }
          ]
        }
      ]
    }
  ]
}

console.log( JSON.stringify(obj) )

function buildtree(obj) {
  let item = {
    title: obj.name || obj.title,children: []
  }
]
result[0].children.push( buildtree(obj) )

console.log( JSON.stringify(result) )
,

所以,如果我认为你是对的,你只需要遍历所有对象,并为每个对象将 'id' 键更改为 'key',将 'name' 键更改为 'title'。这是一个递归解决方案:

function recursiveArray(arr) {
  return arr.map(e => ({
    key: e.id,title: e.name,children: e.children.length ? recursiveArray(e.children) : []
  }));
}

function changeKeysOfNestedObject(obj) {
  return {
    key: obj.id,title: obj.name,children: obj.children.length ? recursiveArray(obj.children) : []
  };
}

//test case
console.log(changeKeysOfNestedObject({
  id: '1234',children: [
    {
      id: '2345',children: [
        {
          id: '3456',children: [
            {
              id: '4567',children: []
            }
          ],}
      ],}
  ],}));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?