2017-04-16 58 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; 
});