我们这里使用node来实现删除一个目录,用现有的node API确实有删除目录的功能,但是目录下如果有文件或者子目录,fs.rmdir && fs.rmdirSync 是不能将其删除的,所以要先删除目录下的文件,最后再删除文件夹。
function deleteFolder(path) { var files = []; if(fs.existsSync(path)) { // 如果目录存在 files = fs.readdirSync(path); files.forEach(function(file,index){ var curPath = path + "https://www.jb51.net/" + file; if(fs.statSync(curPath).isDirectory()) { // 如果是目录,则递归 deleteFolder(curPath); } else { // 删除文件 fs.unlinkSync(curPath); } }); fs.rmdirSync(path); } }
9. 绘制分形图形
通过递归,我们可以在图形学上有更大的自由度,但是请记住,并不是最好的选择。
我们可以借助一些工具和递归的思想,实现如上的分形图案。
10. 扁平化数组Flat
数组拍平实际上就是把一个嵌套的数组,展开成一个数组,如下案例:
let a = [1,2,3, [1,2,3, [1,2,3]]] // 变成 let a = [1,2,3,1,2,3,1,2,3] // 具体实现 function flat(arr = [], result = []) { arr.forEach(v => { if(Array.isArray(v)) { result = result.concat(flat(v, [])) }else { result.push(v) } }) return result } flat(a)
当然这只是笔者实现的一种方式,更多实现方式等着你去探索。
用递归画一棵自定义风格的结构树
通过上面的介绍,我想大家对递归及其应用已经有一个基本的概念,接下来我将一步步的带大家用递归画一棵结构树。
效果图:
该图形是根据目录结构生成的目录树图,在很多应用场景中被广泛使用,接下来我们就来看看他的实现过程吧:
const fs = require('fs') const path = require('path') // 遍历目录/生成目录树 function treeFolder(path, flag = '|_') { var files = []; if(fs.existsSync(path)) { files = fs.readdirSync(path); files.forEach(function(file,index){ var curPath = path + "https://www.jb51.net/" + file; if(fs.statSync(curPath).isDirectory()) { // recurse // obj[file] = treeFolder(curPath, {}); console.log(flag, file) treeFolder(curPath, ' ' + flag) } else { // obj['--'] = file console.log(flag, file) } }) // return obj } } treeFolder(path.resolve(__dirname, './test'))
test为我们建的测试目录,如下:
我们通过短短10几行代码就实现了一个生成结构树的小应用,是不是感觉递归有点意思呢?在这个函数中,第一个参数是目录的绝对路径,第二个是标示符,标示符决定我们生成的树枝的样式,我们可以自定义不同的样式。