当前位置: 首页 > 知识库问答 >
问题:

javascript - 如何将下面结构的数组转成树形结构?

景明诚
2023-09-06
[  {    "id": "1699242303156596738",    "name": "测试a",    "firstLevel": "1692438402382204930",    "secondLevel": "1692438402382204939",    "firstLevelStr": "测试目录1",    "secondLevelStr": "测试目录1-2",    "thirdLevel": "",    "fourthLevel": "",    "thirdLevelStr": "",    "fourthLevelStr": "",  }  ...]

扁平数组的结构如上,每个目录下都可以添加数据

如何将这个数组转成树形的结构啊,转成如下的形式
目录层级的name就取对应的 xxxLevelStr

[        {          id: 3,          name: '访视计划',          children: [            {              id: 31,              name: '研究中心筛选方式',              children: [                {                  id: 33,                  name: '准备',                },                {                  id: 34,                  name: '现场访视',                }              ]            },            {              id: 32,              name: '启动访视',            }          ]        },        {          id: 1,          date: '2016-05-02',          name: '三级目录',          children: [            {              id: 51,              name: '假设A',            }          ]        },        {          id: 2,          name: '假设C',        },        {          id: 4,          name: '假设D',        },        {          id: 456,          name: '假设E',        }      ]

共有2个答案

赵越
2023-09-06
function arrayToTree(arr) {  const map = {};  arr.forEach(item => {    map[item.id] = { ...item, children: [] };  });  const tree = [];  arr.forEach(item => {    const node = map[item.id];    if (item.firstLevel && !item.secondLevel) {      tree.push(node);    } else if (item.secondLevel && !item.thirdLevel) {      map[item.firstLevel].children.push(node);    } else if (item.thirdLevel && !item.fourthLevel) {      map[item.secondLevel].children.push(node);    } else if (item.fourthLevel) {      map[item.thirdLevel].children.push(node);    }  });  return tree.map(item => ({    id: item.id,    name: item.firstLevelStr,    children: item.children.map(child => ({      id: child.id,      name: child.secondLevelStr,      children: child.children.map(grandChild => ({        id: grandChild.id,        name: grandChild.thirdLevelStr,        children: grandChild.children.map(greatGrandChild => ({          id: greatGrandChild.id,          name: greatGrandChild.fourthLevelStr,          children: greatGrandChild.children,        })),      })),    })),  }));}:const arr = [ ...数据 ];const tree = arrayToTree(arr);console.log(JSON.stringify(tree, null, 2));
齐博厚
2023-09-06
function fileList2DirTree(list) {    const dirs = list.reduce((res, item) => {        // 过滤key带level后缀的即目录结构    Object.keys(item).filter(k => k.endsWith('Level') && item[k]).forEach((k,i,arr) => {      // 遍历目录并以key-value形式存储      // 注意Object.keys返回的key的顺序是和数据的key的添加顺序是一致的      // 如果数据不是严格按照first下面是second这样的顺序那么需要再排序下      const dir = res[item[k]] ||= {        id: item[k],        name: item[k+'Str'],        children: [],        parent: i ? item[arr[i-1]] : null, // 由于数据上没有父子目录关联,这里标识      };      // 遍历至末尾则表示文件处于当前目录下,添加该文件      if(i === arr.length-1) dir.children.push({id: item.id, name: item.name});    });    // 返回目录结构树    return res;  }, {});  // 遍历目录树,当目录有父级标识则将自身“拷贝”至该父级目录下  // 若没有父级标识标识当前为1级目录,push进结果集中  return Object.values(dirs).reduce((res, dir) => {    if(!dir.parent) res.push(dir);    else dirs[dir.parent].children.push(dir);    return res;  }, [])}fileList2DirTree([  {    "id": "1111",    "name": "测试a",    "firstLevel": "1",    "secondLevel": "11",    "firstLevelStr": "测试目录1",    "secondLevelStr": "测试目录1-1",    "thirdLevel": "",    "fourthLevel": "",    "thirdLevelStr": "",    "fourthLevelStr": "",  },  {    "id": "2222222",    "name": "测试b",    "firstLevel": "1",    "secondLevel": "12",    "firstLevelStr": "测试目录1",    "secondLevelStr": "测试目录1-2",  },    {    "id": "333333",    "name": "测试c",    "firstLevel": "1",    "secondLevel": "11",      "thirdLevel": "111",    "firstLevelStr": "测试目录1",    "secondLevelStr": "测试目录1-1",      "thirdLevelStr": "测试目录1-1-1",  }])
 类似资料:
  • 题目描述 希望将上面数组用js转化成下面格式,请问如何实现呢

  • 有个以下格式的省市区数组对象: 请问如何用Ts变为以下格式的二维数组?

  • 树形结构组件。 Usage 全部引入 import { TreeView } from 'beeshell'; 按需引入 import { TreeView } from 'beeshell/dist/components/TreeView'; Examples Code 详细 Code ```js import { TreeView } from 'beeshell'; const nest

  • 我试图在我的Rust ray tracer中实现BVH算法,但我在使用寿命和所有权方面遇到了问题。我有一个特性<code>可命中</code>是由一堆不同的东西实现的--<code>球体</code>、<code>三角形</ode>、<code〉网格</code>,等等,所以我有了一个<code>Vec 所以我有这个递归算法,如果不是因为生命周期的问题,它几乎可以工作。我的函数看起来像 首先,我在

  • 我想转换Java8节点流中的一棵树。 下面是一个存储数据的节点树,可以选择: 我想获取所选数据的集合 我想做这样的事情: 问题是找到的实现,我想我可以帮助一些人分享我的解决方案,我很想知道是否有一些问题或更好的方法来做到这一点。 起初,它是用于primeface的,但我将问题推广到所有类型的树。

  • 我在这个结构中有一个数组,其中包含用户元素,每个用户都可以与另一个用户相关 我只想让每个用户都包含其子用户的用户树成为一棵树。 ) 这里user4在user3用户中,user3在user2用户中包含其用户,user2在user1用户中包含其用户,user5在user1用户中包含其用户 所需的结构类似于