【问题标题】:Purifying function to create array of/from File Directory Structure用于创建/从文件目录结构数组的净化功能
【发布时间】:2017-09-12 08:47:16
【问题描述】:

我一直在研究一个函数,该函数将采用相对目录名称,递归遍历目录及其所有子目录,并创建包括文件在内的整个结构的数组。

我从这里完成的工作开始: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'));

于 2017 年 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'));

【问题讨论】:

    标签: javascript arrays node.js functional-programming


    【解决方案1】:

    这里引入了lodash模块。首先,您可以在 walkDirectorySync 中将 map 更改为 reduce 并传递一个数组而不是注入一个数组。其次,您可以对 processDirectory 函数进行 curry,这将允许您将目录 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;
    });
    

    【讨论】:

      猜你喜欢
      • 2015-04-21
      • 2018-03-27
      • 1970-01-01
      • 2019-07-26
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-24
      相关资源
      最近更新 更多