2017-04-16 119 views
0

我一直在努力的功能,将采取相对目录名称,递归迭代通过该目录及其所有子目录,并创建一个整个结构的数组,包括文件。净化函数来创建/从文件目录结构阵列

我开始在这里所做的工作:https://gist.github.com/kethinov/6658166

我开发一个独立的应用程序,并可以利用ES6/ES7的。

以下代码有效。但是,我的主要目标是提高编码技能,所以我想知道是否有更好的方法?更高效?更多功能?

我知道我可以直接将命名函数移动到.map中并使用箭头函数,但是我应该如何处理?在这种情况下,我没有真正返回任何东西,因此使用更简洁的语法不太清楚?我没有明确返回并利用这种回报,而是依赖副作用(?)的事实并非功能性的。

const fs = require('fs'); 
const path = require('path'); 


function walkSync(dir, array = []) { 

    function _process(collectionElement) { 

    const nextJoin = path.join(dir, collectionElement); 
    array.push(nextJoin.replace(/\\/g, '/')); 

    if (fs.statSync(nextJoin).isDirectory()) { 

     walkSync(nextJoin, array); 

    } 

    } 

    fs.readdirSync(dir).map(_process); 

    return array; 

} 

console.log(walkSync('directory')); 

编辑17年4月23日

所以我相信下面是更多的功能和“素净”。不知道我还能做得更好吗?

const fs = require('fs'); 
const path = require('path'); 


// Builds an array of all directories and files 
function processDirectory(content, directory, array) { 

    const item = path.join(directory, content); 

    // reformat for Windows environment 
    array.push(item.replace(/\\/g, '/')); 

    if (fs.statSync(item).isDirectory()) { 

    // eslint-disable-next-line no-use-before-define 
    return walkDirectorySync(item, array); 

    } 

    return array; 

} 

function walkDirectorySync(directory, array = []) { 

    // node reads the directory SYNCHRONOUSLY (maintains order & BLOCKS) 
    fs.readdirSync(directory).map(content => processDirectory(content, directory, array)); 

    return array; 

} 


console.log(walkDirectorySync('world')); 

回答

0

在这里引入了lodash模块。首先,您可以在walkDirectorySync中将地图更改为reduce,并将其传递给一个数组而不是注入一个。其次,你可以curry processDirectory函数,它将允许你将目录curry到processDirectory中,并将curried函数传递给reduce的每次迭代。这将processDirectory转换为减少函数。最后,你可以通过在processDirectory中克隆数组来更纯粹,而不是修改原始数据 - 当然这是以性能成本为代价的,但那对你很有用。

这应该代表更纯粹/功能的方法。我相信总会有进一步改进的空间,但希望这给你一些思考的食物。

const fs  = require('fs'), 
     lodash = require('lodash'), 
     path = require('path'); 

function walkDirectorySync(directory) { 
    return fs.readdirSync(directory).reduce(processDirectory(directory), []); 
} 

const processDirectory = lodash.curry(function (directory, accumulator, content) { 
    accumulator = accumulator.slice(); // trying to be pure here 

    const item = path.join(directory, content).replace(/\\/g, '/'); // reformats for Windows environment 

    accumulator.push(item); 

    if (fs.statSync(item).isDirectory()) { 
    // eslint-disable-next-line no-use-before-define 
    accumulator.push(...walkDirectorySync(item)); 
    } 

    return accumulator; 
});