2017-04-16 5 views
0

相対ディレクトリ名をとり、ディレクトリとそのすべてのサブディレクトリを繰り返して繰り返し実行する関数を作成しています。ファイル。ファイルのディレクトリ構造の配列を作成するための関数を整える

私はここで行われた作業を開始する:私は、スタンドアローンのアプリを開発していますし、ES6/ES7を利用することができますhttps://gist.github.com/kethinov/6658166

次のコードが機能します。しかし、私の主な目標は、自分のコーディングスキルを向上させることであり、より良い方法があるかどうか疑問です。もっと効率的?より機能的ですか?

名前付き関数を.mapに直接移動して矢印関数を使用することはできますが、それは可能ですか?この場合、私は本当に何も返さないので、より簡潔な構文をあまり明確に使用していませんか?私が明示的にそのリターンを返すのではなく、むしろ副作用(?)に頼っているという事実は機能しません。編集4/23/17

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')); 

は、だから私は、次のようにより機能と '純粋な' と考えています。私はまだもっとうまくいくかどうか分かりませんか?

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で縮小するマップを変更し、1つの配列に渡す代わりに1つの配列を渡すことができます。次にprocessDirectory関数をカレーして、ディレクトリをprocessDirectoryにカレーし、カルト関数を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; 
}); 
関連する問題