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", } ])