[ { "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', } ]
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));
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用户中包含其用户 所需的结构类似于